替换html内容而不替换标签或属性-PHP

时间:2018-12-29 21:10:59

标签: php html regex preg-replace

如何在不替换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 <div class="good">nice</div>并忽略任何属性中的good,因为标签和属性是动态的,我不知道,这只是示例。

1 个答案:

答案 0 :(得分:2)

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