2014-03-05 65 views
0

我使用以下代碼從PHP中的HTML文本塊中過濾出url。在php中替換所有不匹配url模式的url url

preg_replace('#<a(?![^>]+?href="?http://keepthisdomain.com/foo/bar"?).*?>(.*?)</a>#i', '\1', $text); 

它旨在替換與指定的url模式不匹配的所有url。不過,我確實希望包含所有具有rel =「shadowbox [a]」屬性的標籤。

我該如何修改這個preg_replace來做到這一點?

+0

爲了澄清,這是一個匹配:(1)與'指定的URL圖案*和* A'標籤' rel =「shadowbox [a]」''屬性,或者(2)具有指定URL模式*或* rel =「shadowbox [a]」屬性的'a'標記? –

+0

P.S.您最好不要使用正則表達式,而應該使用解析器,因爲[在此答案中闡述的原因](http://stackoverflow.com/a/1732454/2057919)。 –

+0

這是一個rel =「shadowbox [a]」屬性的標籤。我想保留這些網址(以及鏈接到http://keepthisdomain.com/foo/bar的所有超鏈接) – lordmj

回答

0

你最好不要使用正則表達式,而應該使用解析器代替the reasons set forth in this answer

這就是說,你可以用正則表達式做到這一點,但它的棘手:

preg_replace('#<a(?![^>]+?\bhref="?http://keepthisdomain\.com/foo/bar"?|[^>]+\brel="shadowbox\[a\]").*?>(.*?)</a>#i', '\1', $text); 

詳細的正則表達式:

<a(?![^>]+?\bhref="?http://keepthisdomain\.com/foo/bar"?|[^>]+\brel="shadowbox\[a\]").*?>(.*?)</a> 

Regular expression visualization

出了以下四個標籤,只第三個將被替換:

<a href="http://keepthisdomain.com/foo/bar">foo</a> // left alone 
<a href="http://keepthisdomain.com/foo/bar" rel="shadowbox[a]">foo</a> // left alone 
<a href="http://rejectthis.com/foo/bar">foo</a> // REPLACED 
<a href="http://rejectthis.com/foo/bar" rel="shadowbox[a]">foo</a> // left alone 

與小調整編輯,以使它匹配.com字面.,使用\.