2013-05-07 41 views
2

我正在尋找正則表達式(php)來查找/替換網頁中的某些單詞。但是,它不能替換所有html標籤之間的單詞,只能在以下內容之間進行替換:斜體< i>,粗體< b>和純文本。正則表達式替換網頁中的單詞

實施例:

詞: 「你好」(不區分大小寫)

<a href="#">Hello</a> im a writer that i like to say hello everyday. <b>Hello</b> Spiderman. 

替代:在錨着的更換,僅你好和< b>Hello< /b>可以被替換。

我測試了一些正則表達式,但沒有正常工作:

1)從SMART SEO鏈接(WP插件)

$reg = '/(?!(?:[^<\[]+[>\]]|[^>\]]+<\/a>))\b($word)\b/Imsu'; 

不能很好地工作,有時,刪除該內容,並把simbol「>」 我對這個正則表達式做了一些修改,刪除了「?!」或「?:」(我不知道是什麼意思),但停止工作。

2)其他我已經試過:

$reg = "/<([\w]+)[^>]*>\b('.$word.')\b<\/\1>/Imsu"; 
$reg = '/<+\s*\/\s\b('.$word.')\b[^>]\/\s>+/I'; 

不能代替任何

$reg = '/<(\w+)[^>]*>\b('.$name.')\b<\/\1>/Imsu'; 

有時工作。

事實是,我不是正則表達式專家,我幾天測試,試圖創建一個新的正則表達式,但沒有達到我需要的結果。

事實是,取代將在WP插件使用,這有時會影響到模板或其他插件或DOM心不是很好創建

任何人有任何想法,爲什麼不能正常工作?謝謝。這些模式的

+1

Id'爲此使用DOM,也許是http://simplehtmldom.sourceforge.net/。 – elclanrs 2013-05-07 10:52:52

回答

2

嘗試組合

$reg = '/(?:<(\w+)[^>]*>)?\bhello\b(?!<\/a>)(<\/\\1>)?/i'; 
$reg0 = '/<\w[^>]*\bhello\b[^>]*>/Ui'; 

$word = preg_quote('hello','/'); // to avoid PCRE injection 
$str = '<a href="hello.php">Hello</a> I say hello everyday. <b>Hello</b> Spiderman.'; 
$reg = '/(?:<(\w+)[^>]*>)?\b'.$word.'\b(?!<\/a>)(<\/\\1>)?/i'; 
$reg0 = '/<\w[^>]*\b'.$word.'\b[^>]*>/Ui'; 

function handler($m) { return str_replace($GLOBALS["word"],'!X!',$m[0]); } 

$str = preg_replace_callback($reg0,'handler',$str); // replace "hello" for say !X! inside tags  
$str = preg_replace($reg,'[deleted]',$str); // delete "hello" elsewhere 
$str = str_replace('!X!',$word,$str); // put "hello" inside tag back 
print_r($str); 

結果

<a href="hello.php">Hello</a> I say [deleted] everyday. [deleted] Spiderman. 

說明你的問題

說明

查看關於上述斷言的鏈接:?<!負向後斷言不能用於匹配<a href="#">,因爲它不是固定長度並導致編譯錯誤。因此,我使用了前瞻斷言?!與hello後的</a>匹配。開頭和結尾的括號包括任何周圍的HTML標籤,因此除了在</a>斷言之外的所有內容都被替換。

的辦法來避免你好更換標籤內是替代他們一些獨特的字符串(比如!X!)然後做原來的更換,然後更換回!X!你好回來。它可能不是最好的解決方案,但它的工作原理。

爲什麼你的正則表達式沒有工作

您使用/I修飾符(在你的模式結束)。修飾符區分大小寫,/i表示不區分大小寫的評估,請參閱the list of modifiers。我相信你的模式中的\b(字邊界)是多餘的。

+0

多數民衆贊成在工作,但它不是真正的即時通訊尋找。這個想法了,只有更換: (1)純文本或標籤(2)文本或(3)文本之間的文本 你的正則表達式替換錨內的文字: 文本必須不能代替 結果我要找應該是這樣的: 'Hello IM,我想說[刪除] everyday.' – Zuljin 2013-05-07 16:37:42

+1

@JuanVargasZuljin作家:我明白了。我已經更新了我的答案 - 現在能工作嗎? – 2013-05-07 17:36:12

+0

再次感謝。我正在測試它,但是當出現這樣的情況''str =「Hello我每天都會打招呼。你好 Spiderman。」;' 結果將是 'Hello我說每天[刪除]。 [刪除] Spiderman.' 正如您所看到的,還會在「href」內進行替換,並確保在上的其他屬性中進行替換,這可能很危險。你有什麼想法 ?太難解決了? – Zuljin 2013-05-08 09:53:17