何时需要在PHP正则表达式中使用u-modifier?

问题描述 投票:0回答:2

[我知道,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符号,因此无论输入哪种编码,它都应在every

输入上起作用,不是吗?请注意,第三个正则表达式使用点运算符,但是当我在字符串的开头和结尾切掉一些ASCII字符时,这也应该在UTF-8上起作用,对吗?

没有人告诉我,如果我忽略了什么吗?

[我知道,PHP PCRE函数将字符串视为字节序列,因此许多站点建议使用/ u修饰符将输入和正则表达式作为UTF-8处理。但是,我真的总是需要吗?我的测试表明,...

php utf-8 preg-replace preg-match pcre
2个回答
2
投票

第一个表达式没有问题。要量化的字符显式为单字节,不能以UTF-8多字节序列出现。


0
投票

u(PCRE_UTF8)此修改器打开了与Perl不兼容的PCRE的其他功能。模式和主题字符串被视为UTF-8。无效的主题将导致preg_ *函数不匹配。无效的模式将触发E_WARNING级别的错误。自PHP 5.3.4起(分别为PCRE 7.3 2007-08-28),五个和六个八位字节的UTF-8序列被视为无效;以前那些被视为有效的UTF-8。

© www.soinside.com 2019 - 2024. All rights reserved.