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

时间:2011-01-07 01:52:58

标签: php regex unicode preg-match multibyte

大家好我有这个代码可以检查5个或更多连续数字:

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

它适用于英语输入,但当输入字符串包含阿拉伯语/多字节字符时它会跳闸 - 有时即使输入文本中没有数字,它也会返回true。

有什么想法吗?

3 个答案:

答案 0 :(得分:6)

您似乎正在使用PHP。

这样做:

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

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

答案 1 :(得分:0)

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

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

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

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

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

查看http://www.pcre.org/pcre.txt,其中包含有关PCRE库中UTF-8支持的大量信息。

答案 2 :(得分:0)

即使在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);

See it in action on ideone.com

如果您需要匹配特定字符或范围,可以使用\x{HHHH}转义序列和相应的代码点:

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{}表单被传递以由正则表达式编译器处理,但这次我们希望 PHP 编译器扩展转义序列。这不会发生在单引号字符串中。