我想在上下文中检查“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 !!!!
为什么我会看到这种行为?
答案 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}}。