在PHP regex中什么时候需要u修饰符? [英] When do I need u-modifier in PHP regex?

查看:31
本文介绍了在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆