2013-03-13 182 views
0

我想使用正則表達式的數組來查找和替換PHP中的字符串,但是我得到錯誤unknown modifier。我知道這似乎是一個流行的問題,但我不明白如何解決它在我的情況。PHP preg_replace「未知修飾符」

這是我原來的正則表達式:

{youtube((?!}).)*} 

我對它運行下面的代碼,以逃避任何字符:

$pattern = '/' . preg_quote($pattern) . '/'; 

返回以下內容:

/\{youtube\(\(\?\!\}\)\.\)\*\}/ 

然而,當我通過preg_replace運行此模式時,出現以下錯誤:

Warning: preg_replace() [function.preg-replace]: Unknown modifier 'y' ... 

任何想法什麼需要改變,以及我在這裏展示的代碼的哪個階段?

非常感謝

編輯1

按照要求,這裏是我使用的代碼:

$content = "{youtube}omg{/youtube}"; 
$find = array(); 
$replace = array(); 

$find[] = '{youtube((?!}).)*}'; 
$replace[] = '[embed]http://www.youtube.com/watch?v='; 
$find[] = '{/youtube((?!}).)*}'; 
$replace[] = '[/embed]'; 

foreach ($find as $key => $value) { 
    $find[$key] = '/' . preg_quote($value) . '/'; 
} 

echo preg_replace($find, $replace, $content); 

這裏有一個live example

+0

不,你爲什麼總是使用'preg_quote'。它是用於文字串部分,但你已經有了一個正則表達式模式。 – mario 2013-03-13 12:53:28

+0

馬里奧,我認爲他們試圖隔離原因。它*仍*拋出奇怪錯誤的事實本身就很有趣。 – Joey 2013-03-13 12:54:10

+0

@mario我使用'preg_quote'來解決早期的問題......但即使沒有它,我也會得到同樣的錯誤。 – 2013-03-13 12:55:53

回答

1

只需將您的正則表達式的分隔符更改爲在模式中沒有使用的東西,在這個例子中我使用了@,它工作正常。

preg_quote只能轉義. \ + * ? [^] $ () { } = ! < > | : -,所以當在你的模式中使用非轉義字符,但也作爲你的正則表達式分隔符,它不會按預期工作。或者像上面那樣更改分隔符,或者將其明確地作爲preg_quote($str, $delimiter) overload的一部分傳遞給preg_quote

$content = "{youtube}omg{/youtube}"; 
$find = array(); 
$replace = array(); 

$find[] = '{youtube((?!}).)*}'; 
$replace[] = '[embed]http://www.youtube.com/watch?v='; 
$find[] = '{/youtube((?!}).)*}'; 
$replace[] = '[/embed]'; 

foreach ($find as $key => $value) { 
    $find[$key] = '@' . preg_quote($value) . '@'; 
} 

echo preg_replace($find, $replace, $content); 
+0

嗨,魯迪,好久不說話......事情怎麼樣?感謝你(和@mario)指出這個問題,'preg_quote'它沒有做替換,但是現在可以刪除它了。 – 2013-03-13 13:18:05

+0

選擇不在模式中的分隔符並不總是很容易,特別是在運行時計算模式時。更好的方法是使用標準分隔符「/」,並將其作爲第二個參數傳遞給'preg_quote',所以'preg_quote'會將其與其他特殊字符一起引用。查看我的答案代碼示例。 – 2013-03-13 13:51:31

+0

@ilmv - 事情很好,你的東西怎麼樣?應該給我發電子郵件並追上:D – 2013-03-13 14:05:02

0

您應該分隔符傳遞作爲第二個參數爲preg_quote這樣的:

$find[$key] = '/' . preg_quote ($value, '/') . '/'; 

否則,分隔符將不被引用,因而會產生問題。

0

我可能坐在離電腦不遠的醫院候診室裏,但是你正在做的事情似乎已經解決了這個問題。

如果我正確地理解這一點,你要替換一些這樣的:

{youtube something="maybe"}http://...{/youtube} 

有了:

[embed]http://...[/embed] 

沒有?

如果是這樣的解決方案是沿着線的東西一樣簡單的情況:

preg_replace('#{(/?)youtube[^}]*}#', '[\1embed]', $content); 

是標籤的開啓/關閉的煩躁的保存,並在一些包裝的正則表達式的重要考慮因素這與你的目標字符串,在這種情況下,散列並不衝突。

+0

preg_replace_all可能是必要的,以確保您捕獲所有的標籤,而不僅僅是第一個。 – Steve 2013-03-13 13:28:26

相關問題