2012-09-19 52 views
1

的follwing代碼給我一個錯誤 「的preg_replace()[function.preg替換]:未知的修飾詞 '?'」preg_replace()[function.preg-replace]:未知修飾符'?'

$str = 'background: url("../../dsdgsd/contain.jpg");'; 

echo preg_replace('/url\s?\(\s?(\"|\')([../?]*[a-z/]*?[/?]?)([a-z0-9_-]*[.][jpg|jpeg|png|jpeg]*)([\'|\"]\))/gi','url("../images/$3")',$str); 
+0

你對[regex語法](http://us.php.net/manual/en/regexp.reference.delimiters.php)有多熟悉?要麼使用模式本身不太可能發生的分隔符,例如'#',或者在模式中轉義'/'的每個實例。 – DCoder

+2

編寫這個正則表達式的人,混淆了'['和'('(除了各種其他問題)「,例如:'[../?]*''應該可以讀爲'(\\。\\ ./)*' ,即「多次出現'../'」 – mvds

回答

2

我不知道這是什麼正則表達式是應該做的,但給出的錯誤,因爲你必須在模式/字符。解析器然後認爲你的模式已經完成,並且將它後面的所有內容(在這種情況下爲?)作爲修飾符。因此錯誤。

修復使用另一種分離器:(大多數人使用#有很多的/打交道時)

echo preg_replace('#url\s?\(\s?(\"|\')([../?]*[a-z/]*?[/?]?)([a-z0-9_-]*[.][jpg|jpeg|png|jpeg]*)([\'|\"]\))#i','url("../images/$3")',$str); 

(從這個分開,如已經提到的,不需要g修改)

+0

感謝好友,它完美運作......「#」的概念真棒! –

1

由於您使用/字符開始正則表達式,因此它是一個分隔符,您應該在正則表達式中跳過所有出現的/。因爲第二個/之後的第一個字符是?,所以它被解釋爲修飾符。

相關問題