2015-10-14 53 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

相关问题