2014-10-30 51 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); 

?>