Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么\b对某些语言不能正常工作?_Php_Regex_Word Boundary - Fatal编程技术网

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

Php 为什么\b对某些语言不能正常工作?,php,regex,word-boundary,Php,Regex,Word Boundary,这是我的代码:(它适用于英语) 但是我不知道为什么,上面的正则表达式对于波斯语来说并不正确:(它总是返回1) 如何修复它?如果您已将正则表达式放入“/[\b(?:1583;یوا㶈㶈)\b]/u”中的字符类中,请从中删除[]: "/\b(?:دیوار|خوب)\b/u" 您可以将\b替换为其他选项: "/(?:^|\s)(?:دیوار|خوب)(?:\s|$)/u" 您还可以使用列出阿拉伯字母的否定字符类更改\s。我不认识他们,但这就像:[^1583]。。字符类或双引号正则表达式中的\

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


但是我不知道为什么,上面的正则表达式对于波斯语来说并不正确:(它总是返回
1


如何修复它?

如果您已将正则表达式放入
“/[\b(?:1583;یوا㶈㶈)\b]/u”中的字符类中,请从中删除
[]

"/\b(?:دیوار|خوب)\b/u"
您可以将
\b
替换为其他选项:

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

您还可以使用列出阿拉伯字母的否定字符类更改
\s
。我不认识他们,但这就像:
[^1583]。

字符类或双引号正则表达式中的
\b
是一个退格字符

这就是为什么正确答案是:要么使用单引号正则表达式声明,以免使用双转义,要么在双引号正则表达式中的
b
之前使用双反斜杠

  • “/\b(?:دیا㶈みوب)\b/u'
  • “/\\b(?:دیواみوب)\\b/u”
见此:


您仍然需要为您的问题添加适当的描述。@DanielCheung我需要检查带有一些关键字的字符串。如果字符串中至少存在一个关键字,则返回
1
,否则返回
2
。也许这个答案可以帮助您:@swidmann我已经看到了您以前链接我的内容。它不能正常工作。我测试了它。仍然不起作用,你的解决方案总是返回
2
@Sajad:真奇怪,在这里,它起作用了,它为
$str1
提供
1
,为
$str2
提供
2
。哦,真的吗?!你有不同的结果?!是的,很奇怪。只有一件事,这里面的
?:
(?:code>)?如果我删除它会发生什么?@Sajad:它是一个非捕获组,如果你不需要捕获值,它比捕获组更有效。对不起,我不太懂英语,我想知道“变通”与“解决方案”是一样的?“变通”指的是一个临时解决方案,它不能100%按预期工作或工作速度较慢,因为真正的解决方案不可能或太难/太耗时而无法创建。试着在逗号内加上单词,托托的解决方案就行不通了。
"/\b(?:دیوار|خوب)\b/u"
"/(?:^|\s)(?:دیوار|خوب)(?:\s|$)/u"
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)