问题
尽管PHP手册声明:
为什么波斯数字在“UTF-8模式”下会匹配\d
或[[:digit:]]
?
阐述
在一个非相关问题的回答中提到,正则表达式中的\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
标志的第一个测试就毫无意义,因为匹配将按字节语义进行。如果您在SHIFT-JIS编码的字符串中使用\w
,则可能会匹配某个字符的第二个字节。请参见此答案中的示例部分,了解有关非UTF模式和后果的说明:https://dev59.com/TWEi5IYBdhLWcg3wx-xs#30556342 - nhahtdh