2014-10-30 86 views
0

假设我有HTML块,在回显到屏幕之前,我想在内容上进行查找和替换。替换HTML代码块中的单词而不更改HTML

如何确保我不会更改HTML,而只是更改内容(使用PHP)。

举例来说,如果我有这样的:

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

,我想,以取代“你好”的所有单词与“嗨”我想要的内容来得到这样的结果:

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

目前我正在使用preg_replace,例如

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

但是,这会给我的结果

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

为什么不'阵列( “/>你好/”),阵列( “>嗨”)'? – 2014-10-30 14:20:19

+0

你想把'Hello'换成'Hi'? – 2014-10-30 14:20:20

+0

这只是一个例子。内容将比这更长,我想要替换的单词可能不一定跟在右括号之后。 – 2014-10-30 14:43:49

回答

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; 
0

如果你正期待着从Hello改变Hi然后,

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

之间的任何东西的正则表达式这只是一个例子。内容将比这更长,我想要替换的单词可能不一定跟在右括号之后。 – 2014-10-30 14:49:49

0

尝试使用这一说法(见答案this question)仅匹配发生在><之间的文本:

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

这只是一个例子。内容将比这更长,我想要替换的单词可能不一定跟在右括号之后。 – 2014-10-30 14:49:21

+0

我编辑了我的答案。这更接近你要找的东西吗? – 2014-10-30 15:16:13

+0

非常感谢。我试过这个,但问题是如果你有:

Hello

那么这匹配两个Hellos,因为它们出现在p标签的<<之间。 – 2014-10-30 15:33:55

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); 

?>