2015-10-14 85 views
1

我有一個通用的例程,用於將短代碼(以「^」字符開頭)替換爲特定於性別的選項。我被要求擴展這個以糾正一些常見的拼寫錯誤。這些詞在開始時不會有特殊的字符。如何匹配包含特殊字符的正則表達式模式?

到目前爲止,我一直在使用PHP的str_replace函數,但由於某些單詞出現在其他單詞中的可能性,我需要確保代碼在匹配時使用單詞邊界。我現在試圖使用preg_replace

雖然實際的代碼是從數據庫表中獲取數據,包括性別特定的替換,但我可以用更簡單的代碼重現問題以便提出此問題。

考慮具有$search => $replace結構下面的數組:

$subs = array("^Heshe" => "He", 
    "apples" => "bananas"); 

我然後通過陣列要循環到替換標記:

$message = "^Heshe likes apples but not crabapples."; 
foreach ($subs as $search => $replace) 
{ 
    $pattern = '/\b' . preg_quote($search, '/') . '\b/u'; 
    $message = preg_replace($pattern, $replace, $message); 
} 
echo $message; 

我期望該消息將被顯示He likes bananas but not crabapples.,而是我收到消息^Heshe likes bananas but not crabapples.

我也試過$pattern = '/\b\Q' . $search . '\E\b/u',還帶有t他同樣的結果。

不幸的是,「^」字符是一些遺留系統的一部分,改變它是不可行的。我如何獲得正則表達式?

回答

2

問題是這一行:

$pattern = '/\b' . preg_quote($search, '/') . '\b/u'; 

由於$search^Heshe你不能^以前匹配\b(字邊界),因爲這不是一個單詞字符。

您可以使用lookarounds中而不是你的模式是這樣的:

$pattern = '/(?<!\w)' . preg_quote($search, '/') . '(?!\w)/u'; 

這意味着比賽$search如果不遵守,一個字字符開頭。

或者使用:

$pattern = '/(?<=\s|^)' . preg_quote($search, '/') . '(?=\s|$)/u'; 

如果是跟着並且由空格或行開始/結束之前這意味着比賽$search

+1

謝謝!您的第一個選項似乎按預期工作。然而,你的第二個並不能取代這個字符串中的最後一個「蘋果」:'$ message =「^ Heshe喜歡蘋果,但不喜歡海棠,他喜歡蘋果。 – Philip

+0

是的。我的首選也是第一個**負面預測**正則表達式。 – anubhava

相關問題