替换HTML代码块中的单词而不更改HTML

时间:2014-10-30 14:18:04

标签: php html regex html-parsing

让我们说我有HTML块,我想在回显到屏幕之前对内容进行查找和替换。

如何确保我不会更改HTML,只是更改内容(以PHP格式)。

例如,如果我有这个:

<div class='Hello'>Hello</div>

我想替换所有&#39; Hello&#39;内容中包含&#39;嗨&#39;我想得到这个结果:

<div class='Hello'>Hi</div>

目前我正在使用preg_replace,例如

$new_code = preg_replace(array("/Hello/"), array("Hi"), $code);

但这会给我结果

<div class='Hi'>Hi</div>

4 个答案:

答案 0 :(得分:1)

不要使用正则表达式在HTML中查找文本而是使用DOM解析器:

你可以使用DomDocument,但要注意它会使用部分HTML做一些奇怪的事情,但这是一个让你前进的例子:

$dom = new DOMDocument();
$dom->loadHTML("<html><body><p>Hello</p></body></html>");

$els = $dom->getElementsByTagName('*');

foreach ( $els as $el ) {

    if (preg_replace("/Hello/","Hi",$el->nodeValue))
    {
        $el->nodeValue =preg_replace("/Hello/","Hi",$el->nodeValue);
    }

} 

echo $dom->saveHTML();

Simple HTML DOM可能符合您的需求:

网站示例:

$html = str_get_html('<div class='Hello'>Hello</div>');

$html->find('div', 0)->innertext = 'Hi';

echo $html;

答案 1 :(得分:0)

如果您期待从Hello更改为Hi,那么

$new_code = preg_replace(array("/\>Hello/"), array(">Hi"), $code);

答案 2 :(得分:0)

尝试使用此断言(请参阅this question的答案)仅匹配><之间出现的文字:

$new_code = preg_replace(array("/(Hello)(?=[^>]*(<|$))/"), array("Hi"), $code);

答案 3 :(得分:0)

试试这个:

<?PHP

$html = '<div class="HeLLo" id="HEllO">Hello how to say "hEllo"
         for heLlo world in a helLo world of hellO</div>';

echo preg_replace('/(hello)(?![^>](\s*\w+=".*")*\s*>)/i', "Hi", $html);

?>