正则表达式匹配以unicode字符开头的单词会返回意外结果

时间:2013-12-29 12:22:41

标签: php regex unicode

我想在上下文中检查“açilek”这个词的存在。运行这个:

$word = 'açilek';
$article='elma  and  açilek word';
$mat=preg_match('/\b'. $word .'\b/', $article);
var_dump($mat);

成功。这是预料之中的。但是,要匹配单词'çilek',代码将返回False,这是不期望的:

$word = 'çilek';
$article='elma  and  çilek word';
$mat=preg_match('/\b'. $word .'\b/', $article);
var_dump($mat); //returns false !!!!

此外,如果它是单词的一部分,它将匹配此单词,也是意外的:

$word = 'çilek';
$article='elma  and  açilek word';
$mat=preg_match('/\b'. $word .'\b/', $article);
var_dump($mat); //returns true !!!!

为什么我会看到这种行为?

2 个答案:

答案 0 :(得分:3)

请注意,如果您不提供“u”开关,则PCRE引擎不会看到UTF8 字符模式/元字符(并且很可能会破坏匹配),如下所示:

http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php

$mat=preg_match('/\b'. $word .'\b/u', $article);

答案 1 :(得分:3)

您需要使用/u修饰符来使正则表达式(尤其是\b)识别Unicode:

$mat=preg_match('/\b'. $word .'\b/u', $article);

否则,\b仅将ASCII字母数字和ASCII非字母之间的位置视为字边界,因此在açilek之间匹配,但在 和{{之间不匹配1}}。