使用 str_replace 忽略 HTML

Ignore HTML with str_replace

我正在尝试用 str_replace 替换带下划线 (_) 的空格,但它也会影响 HTML 标签。

我的代码:

add_filter( 'facetwp_facet_html', function( $output, $params ) {
    if ( 'blog_tags' == $params['facet']['name'] ) {
        $output = str_replace(' ', '_', $output);
    }
    return $output;
}, 10, 2 );

预期结果是:

<div class="checkbox">Dynamic_String_Exemple<span class="counter">1</span></div>

但是 returns:

<div_class="checkbox">Dynamic_String_Exemple<span_class="counter">1</span></div>

div_class span_class

防止这种情况的最佳方法是什么?

我们只有一个示例字符串可供构建,因此我不保证这适用于您项目中的所有情况,但是...

您应该使用 dom 解析技术,因为基本字符串函数定位在有效 html.

中更容易出错

代码:(Demo)

$html = <<<HTML
<div class="checkbox">Dynamic_String_Exemple<span class="counter">1</span></div>
HTML;

$dom = new DOMDocument;
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$firstDivFirstNode = $dom->getElementsByTagName('div')->item(0)->childNodes->item(0);
$firstDivFirstNode->nodeValue = str_replace(' ', '_', $firstDivFirstNode->nodeValue);
echo trim($dom->saveHTML());