php - 我什么时候需要在 PHP 正则表达式中使用 u-modifier?
问题描述
我知道,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
对所有可能包含 U+007F 以上字符的文本使用是最佳实践。
推荐阅读
- angular - 使用 ng-packagr 组件时“没有 ViewContainerRef 的提供者”
- jmeter - 分布式环境显示 JMeter 错误
- c# - C# webclient 下载最新的CCleaner
- laravel - 提交时出错,提示“找不到对象!”
- selenium - selenium webdriver_有没有其他方法可以在不使用“findElements()”方法的情况下找出网页中存在的 webelements 的数量?
- javascript - JS:单击数组中的对象 --> 显示更多信息
- java - 长时间运行的春季计划任务
- java - 从一个列表填充多个列表
- aws-lambda - 在 aws lambda 中使用 LWA 链接我的技能时,如何从我的数据库中获取设备列表?
- docker - 从什么时候将用户添加到 docker 组不足以执行 docker 客户端并且我每次都需要`newgrp docker`?