使用 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());
我正在尝试用 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());