【发布时间】:2016-10-06 02:28:37
【问题描述】:
问题
尽管 PHP 手册说明:
为什么波斯数字在“UTF-8 模式”中匹配 \d 或 [[:digit:]]?
细化
在non-related question 的回答者评论中提到,在正则表达式中,\d 不仅匹配 ASCII 数字 0 到 9,而且还匹配波斯数字 (۰ ۱ ۲ ۳ ۴ ۵ ۶ ۷)。
上面提到的问题被标记为java,但在 PHP 中也可以观察到这种行为。考虑到这一点,我编写了以下“测试”:
$string = 'I have ۳ apples and 5 oranges';
preg_match_all('/\d+/', $string, $capture);
结果数组$capture 包含5 的匹配项仅。
使用u 修饰符打开“UTF-8 模式”并运行:
$string = 'I have ۳ apples and 5 oranges';
preg_match_all('/\d+/u', $string, $capture);
导致$capture 包含۳ 和5 的匹配项。
注意事项
- 此问题涉及 PHP 5.6.22(最新版本)
- 这两个测试都是在明确使用
C语言环境时执行的。
【问题讨论】:
-
第一个没有
u标志的测试当你的字符串不是ASCII时是没有意义的,因为匹配将使用字节语义进行。如果您将\w与SHIFT-JIS 编码字符串一起使用,您可能会匹配某个字符的第二个字节。有关非 UTF 模式和后果的说明,请参阅此答案中的示例部分:stackoverflow.com/questions/20954580/maximum-hex-value-in-regex/…
标签: java php regex utf-8 pcre character-class