在PHP regex中什么时候需要u修饰符?

本教程将介绍在PHP regex中什么时候需要u修饰符?的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

在PHP regex中什么时候需要u修饰符? 教程 第1张

问题描述

我知道,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修饰符?的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。