Php 检测连续数字的正则表达式-不适用于非英语输入
您好,我有一个检查5个或更多连续数字的代码: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
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
?我很想看到这个错误。