Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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 检测连续数字的正则表达式-不适用于非英语输入_Php_Regex_Unicode_Preg Match_Multibyte - Fatal编程技术网

Php 检测连续数字的正则表达式-不适用于非英语输入

Php 检测连续数字的正则表达式-不适用于非英语输入,php,regex,unicode,preg-match,multibyte,Php,Regex,Unicode,Preg Match,Multibyte,您好,我有一个检查5个或更多连续数字的代码: if (preg_match("/\d{5}/", $input, $matches) > 0) return true; 它适用于英语输入,但当输入字符串包含阿拉伯文/多字节字符时,它会出错-有时即使输入文本中没有数字,它也会返回true 有什么想法吗?当你想处理UTF-8时,你必须正确设置自己 您可以在启用PCRE UTF-8标志的情况下重新编译php 或者,您可以将序列(*UTC8)添加到正则表达式的开头。例如: /(*UTF8)[:a

您好,我有一个检查5个或更多连续数字的代码:

if (preg_match("/\d{5}/", $input, $matches) > 0)
return true;
它适用于英语输入,但当输入字符串包含阿拉伯文/多字节字符时,它会出错-有时即使输入文本中没有数字,它也会返回true


有什么想法吗?

当你想处理UTF-8时,你必须正确设置自己

您可以在启用PCRE UTF-8标志的情况下重新编译php

或者,您可以将序列
(*UTC8)
添加到正则表达式的开头。例如:

/(*UTF8)[:alnum:]/
,输入
é
,输出
TRUE

/[:alnum:]/
,输入
é
,输出


请查看,其中包含了PCRE库中有关UTF-8支持的大量信息。

您似乎正在使用PHP

这样做:

if (preg_match("/\d{5}/u", $input, $matches) > 0)
return true;

请注意表达式末尾的“u”修饰符。它告诉preg_*使用unicode模式进行匹配

即使在UTF-8模式下,预定义的字符类,如
\d
[[:digit:][]
也只匹配ASCII字符。要匹配潜在的非ASCII数字,必须使用等效的Unicode属性,
\p{Nd}

$s = "12345\xD9\xA1\xD9\xA2\xD9\xA3\xD9\xA4\xD9\xA5";
preg_match_all('~\p{Nd}{5}~u', $s, $matches);

如果需要匹配特定的字符或范围,可以使用带有适当代码点的转义序列
\x{hhh}

preg_match_all('~[\x{0661}-\x{0665}]{5}~u', $s, $matches);
…或使用
\xHH
表单输入其UTF-8编码的字节序列:

preg_match_all("~[\xD9\xA1-\xD9\xA5]{5}~u", $s, $matches);

注意,对于最后一个示例,我切换到了双引号。
\p{}
\x{}
表单被传递给regex编译器处理,但这次我们希望PHP编译器扩展转义序列。这不会发生在单引号字符串中。

免责声明:这是纯粹的研究;我自己也没有试过。嗨,我已经正常使用UTF8了,即使是英文版——问题不在于UTF8,更多的是多字节字符,我已经更新了description@SherifBuzz:据我所知,这就是PCRE标志支持的内容。多字节在某种程度上是UTF-8固有的。否则假定为[单字符]ASCII。请问您是如何知道您的英语字符串是多字节的?@Tomalak Geret'kal我的英语字符串不是多字节的-阿拉伯语的ons是-我记得在某处看到一个解决方案,涉及使用iconv解决类似问题,“但我似乎找不到它。@谢里夫巴兹谢谢你非常有用的错误报告。你有没有可能粘贴错误的
$input
?我很想看到这个错误。