为什么\ b对某些语言不能正常工作?

时间:2015-11-12 12:28:40

标签: php regex word-boundary

这是我的代码:(它适用于英语)

$str1 = "itt is a testt";
$str2 = "it is a testt";
$str3 = "itt is a test";
$str4 = "it is a test";

echo preg_match("[\b(?:it|test)\b]", $str1) ? 1 : 2; // output: 2 (do not match)
                                     $str2           // output: 1 (it matches)
                                     $str3           // output: 1 (it matches)
                                     $str4           // output: 1 (it matches)

但是我不知道为什么,上面的 REGEX 对于波斯语言不能正常工作:(它总是返回1

$str1 = "دیوار";
$str2 = "دیوارر";

echo preg_match("/[\b(?:دیوار|خوب)\b]/u", $str1) ? 1 : 2; // output: 1
echo preg_match("/[\b(?:دیوار|خوب)\b]/u", $str2) ? 1 : 2; // output: 1 (it should be 2)

我该如何解决?

2 个答案:

答案 0 :(得分:4)

您已将正则表达式放在"/[\b(?:دیوار|خوب)\b]/u"中的字符类中,从中移除[]

"/\b(?:دیوار|خوب)\b/u"

您可以用替代方法替换\b

"/(?:^|\s)(?:دیوار|خوب)(?:\s|$)/u"

您还可以使用列出阿拉伯字母的负字符类更改\s。我不了解它们,但它们就像:[^دیوارخوب] ......

答案 1 :(得分:1)

字符类内部或双引号正则表达式中的\b退格字符。

这就是为什么正确答案是:使用单引号正则表达式声明以便不使用双重转义,或者在双引号正则表达式中b之前使用双反斜杠。

  • '/\b(?:دیوار|خوب)\b/u'或......
  • "/\\b(?:دیوار|خوب)\\b/u"

请参阅此IDEONE demo

echo preg_match('/\b(?:دیوار|خوب)\b/u', $str1) ? 1 : 2; // output: 1
echo preg_match('/\b(?:دیوار|خوب)\b/u', $str2) ? 1 : 2; // output: 1 (it should be 2)