【问题标题】:Replace html content without replacing the tags or attributes - PHP替换 html 内容而不替换标签或属性 - PHP
【发布时间】:2019-05-27 03:42:54
【问题描述】:

如何在不替换 HTML 标签或属性的情况下替换 HTML dom 内部或外部的内容?

例如

$txt='good <div class="good">good</div>'
$search='good';
$pattern      = '#(?!<.*?)(\b'.$search.'\b)(?![^<>]*?>)#si'; 
$replacement  = 'nice';
$txt = preg_replace($pattern, $replacement, $txt);

所以我希望它输出nice &lt;div class="good"&gt;nice&lt;/div&gt; 并忽略任何属性中的good,因为标签和属性是动态的,我不知道,这只是示例。

【问题讨论】:

  • 我猜你确实意识到正则表达式很难。为什么?因为解析器的工作是查找文本节点而不是正则表达式。

标签: php html regex preg-replace


【解决方案1】:

尝试使用 dom:

$txt='good <div class="good">good</div>';
$search = 'good';
$replace  = 'nice';

libxml_use_internal_errors(true);
$dom = new DomDocument();
$dom->loadHTML($txt, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($dom);

foreach ($xpath->query('//text()') as $text) {
    if (trim($text->nodeValue)) {
        $text->nodeValue = str_replace($search,$replace, $text->nodeValue);
   }
}
echo $dom->saveHTML();

【讨论】:

  • 好方法,我只是更改 xpath,$xpath-&gt;query('//div[contains(@class,"good")]')
  • 这会在原始 html 3v4l.org/18Lke 周围输出一个虚假的 &lt;p&gt; 标签
  • $txt='&lt;span id="good"&gt;good&lt;/span&gt;good &lt;div class="good"&gt;good&lt;/div&gt; '; 输出错误 &lt;span id="good"&gt;nice&lt;p&gt;nice &lt;/p&gt;&lt;div class="good"&gt;nice&lt;/div&gt;&lt;/span&gt; 3v4l.org/BUoZl
  • 我从$dom-&gt;loadHTML($txt,LIBXML_HTML_NODEFDTD); 中删除了LIBXML_HTML_NOIMPLIED,还使用preg_replace $html=preg_replace(array("/(^&lt;html&gt;|&lt;\/html&gt;$)/i","/(^&lt;body&gt;|&lt;\/body&gt;$)/i"), "", $dom-&gt;saveHTML()); 从html 中删除了第一个html 和body 标记,然后它可以根据需要完美运行。非常感谢! 3v4l.org/LJ5aq
猜你喜欢
  • 1970-01-01
  • 2017-10-04
  • 1970-01-01
  • 2022-12-08
  • 2013-12-07
  • 2011-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多