2012-03-05 49 views
0

下面的模式似乎在正則表達式編輯器中工作,但它在PHP中無效(無錯誤)。 我想通過添加分隔符並通過preg_quote運行模式來解決這個問題。 希望在這裏失蹤的步驟有任何幫助。儘管preg_quote工作正則表達式模式在PHP中不起作用

代碼示例:

$pattern = '%(?<[email protected]|.)singleline(?=[^\]\[]*\])%'; 
$pattern = preg_quote($pattern); 
$output = preg_replace($pattern, "", $output); 

HTML樣本:

<p>[@address|singleline]</p> 
+0

你可以添加$輸出變量的預期的內容? – 2012-03-05 17:28:22

回答

2

preg_quote逸出是正則表達式語法的字符的字符。這些包括. \ + * ? [^] $ () { } = ! < > | : -。儘量不要使用preg_quote

$pattern = '%(?<[email protected]|.)singleline(?=[^\]\[]*\])%'; 
$output = preg_replace($pattern, "", $output); 

編輯: 您可能需要使用preg_quote,如果你有你想要的,其中包含在正則表達式語法中使用的字符的正則表達式包含的內容。例如:

$input = "item 1 -- total cost: $5.00"; 
$pattern = "/total cost: " . preg_quote("$5.00") . "/"; 
// $pattern should now be "/total cost: \$5.00/" 
$output = preg_replace($pattern, 'five dollars', $input); 

在這種情況下,你需要躲避$,因爲它是在正則表達式語法中使用。要搜索它,您的正則表達式應該使用\$而不是$。使用preg_quote爲您執行此更改。

+0

Thx。這工作...感覺像一個白癡沒有想到它。所以不需要preg_quote,因爲一切都已經逃脫了? – jsuissa 2012-03-05 17:56:44

+0

什麼都不需要逃脫。正如@ a.tereschenkov所提到的,如果你的模式中有一些內容需要被轉義,preg_quote會是相關的。我會編輯我的答案來舉個例子。 – thetaiko 2012-03-05 17:58:39

1

我想你應該preg_quote不適用於全模式,但只適用於(也許)外部字符串。看看這個代碼:

<?php 
    $content = 'singleline'; 
    $content = preg_quote($content); 
    $output = '<p>[@address|singleline]</p>'; 
    $output = preg_replace('%(?<[email protected]|.)'.$content.'(?=[^\]\[]*\])%', "", $output); 

    echo $output; 

正如你可以看到我申請preg_quote僅爲$內容變量(這可能是某些字符,你需要逃脫)

+0

Thx。一直在使用類似的方法。對於這個問題,我只是硬編碼變量。 – jsuissa 2012-03-05 18:03:45