2010-02-01 62 views
2
$test = "<div><b><i>#uniquetag#</b></i></div> <div>Keep this</div>"; 

$test = preg_replace("/<div(.*)#uniquetag#(.*)<\/div>/i", "#uniquetag#", $test); 

我想要的結果是PHP的preg_replace - 正則表達式不包括短語

$test = "#uniquetag# <div>Keep this</div>"; 

但它返回

$test = "#uniquetag#"; 

我想我知道這是爲什麼。 (。*)是貪婪的,它將搜索擴展到結尾。但我無法弄清楚什麼是正確的做法。

更新:

特別感謝ghostdog74。老問題解決了。一個新的問題是經驗豐富....

$test = "<div></div> <div><b><i>#uniquetag#</b></i></div> <div>Keep this</div>"; 

$test = preg_replace("/<div(.*)#uniquetag#(.*?)<\/div>/i", "#uniquetag#", $test); 

預期的結果是

$test = "<div></div> #uniquetag# <div>Keep this</div>"; 

但事實證明是

$test = "#uniquetag# <div>Keep this</div>"; 

同樣,我相信這是因爲第一(。 )。將其更改爲(.?)也無濟於事。需要想辦法排除。

回答

3

變化(.*)(.*?)

+0

它有效,但我面臨另一個問題。如果在此代碼之前有一個div標籤,它會吞噬它之前的所有div。 – 2010-02-01 08:47:03

+0

在您的問題和您的預期輸出中顯示您的示例 – ghostdog74 2010-02-01 09:08:16

3

在大多數情況下,我強烈建議使用HTML解析器(例如this one)來獲取這些鏈接。使用正則表達式來解析HTML會有問題,因爲HTML不規則,你不會考慮邊緣情況。

有關更多信息,請參閱here。與HTML代碼時

+2

HTML解析器並不總是最好的方法。如果他正在處理的代碼總是按照這種格式進行格式化(例如,因爲他在之前的某個位置生成該代碼),那麼對於簡單的更改,RegExp就是一種很好的快速方法。 – poke 2010-02-01 08:26:22

+0

我認爲這是一個公平的評論,而實用主義是一個很好的指導原則。我已經修改以反映這一附帶條件。 – 2010-02-01 08:34:04