在PHP regex中什么时候需要u修饰符? [英] When do I need u-modifier in PHP regex?
本文介绍了在PHP regex中什么时候需要u修饰符?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我知道,PHP PCRE函数将字符串视为字节序列,所以很多站点建议使用/u
修饰符来处理输入和正则表达式作为UTF-8。
但是,我真的总是需要这个吗?我的测试表明,当我不使用转义序列或点或类似的东西时,这个标志没有什么不同。
例如
preg_match('/^[da-f]{40}$/', $string);
检查字符串是否具有SHA1哈希格式
preg_replace('/[^a-zA-Z0-9]/', $spacer, $string);
替换每个非ASCII字母或数字的字符
preg_replace('/^+((.*))$/', '1', $string);
获取+(XYZ)
的内部内容
这些正则表达式仅包含单字节ASCII符号,因此它应该适用于每个输入,而不考虑编码,不是吗?请注意,第三个正则表达式使用点运算符,但是由于我在字符串的开头和结尾去掉了一些ASCII字符,所以这应该也适用于UTF-8,对吗?
没有人能告诉我我是否忽略了什么吗?
推荐答案
第一个表达式没有问题。要量化的字符显式为单字节,不能出现在UTF-8多字节序列中。
第二个表达式可能会给出比您预期更多的间隔符;例如:
echo preg_replace('/[^a-zA-Z0-9]/', "0", "💩");
// => 0000
第三个表达式也不会造成问题,因为重复字符受括号限制(这是ASCII安全的)。
这更危险:
echo preg_replace('/^(.)/', "0", "💩");
// => 0???
通常,在不详细了解UTF-8工作原理的情况下,预测哪些正则表达式安全,哪些不安全可能很困难,因此对可能包含U+007F以上字符的所有文本使用/u
是最佳做法。
这篇关于在PHP regex中什么时候需要u修饰符?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文