PHP正则表达式替换字符串开头的单词,或后跟空格

时间:2013-11-01 15:01:30

标签: php regex

我对正则表达式有点生疏,所以非常感谢你的帮助。对于当前项目,我需要清理一些用户输入并将缩写的英国郡名称转换为他们的详细对应物(例如Lincs => Lincolnshire)。

我编写了一个函数来处理这个使用正则表达式的函数,因为我们只想在缩写位于字符串的开头,或者以逗号或空格开头之前进行替换,后跟空格(或字符串终止)。

因此,考虑Lincs的示例,应该发生以下替换:

Boston, Lincs => Boston, Lincolnshire(因为Lincs前面有空格)
Lincs => Lincolnshire(因为Lincs位于字符串的开头)
Test, Lincsto => Test, Lincsto因为Lincs后面有其他字符)

以下是该功能现在的样子:

function fullCounties()
{
    $replacements = array(
        'lincs' => 'Lincolnshire'
    );

    $new = $_REQUEST['place'];
    foreach($replacements as $find => $replace)
    {
        $new = preg_replace('/(^|\W)'.$find.'([\W\d])/', $replace, $new);
    }
    echo $new;
}

但这只是返回Boston, Lincs,而不是预期的Boston, Lincolnshire。任何人都可以解释正确的RegExp以符合上述要求,或者说明为什么这个不起作用?

2 个答案:

答案 0 :(得分:1)

  

我们只想在缩写位于字符串的开头,或者以逗号或空格开头,后跟空格(或字符串终止)时进行替换。

将此代码与外观正则表达式一起使用:

$new = preg_replace('/(?<=^|[,\s])'. preg_quote($find) . '(?=\s|$)/', $replace, $new);

答案 1 :(得分:1)

这是因为您使用Lincs搜索lincs,如果没有case-insensetive标记,则会失败。此外,您可能希望查看Word边界(\b)。

$new = preg_replace("(\b".preg_quote($find)."\b)i",$replace,$new);