什么时候我需要PHP正则表达式中的u-modifier?
我知道,PHP PCRE函数将字符串视为字节序列,因此许多站点建议使用什么时候我需要PHP正则表达式中的u-modifier?,php,utf-8,preg-replace,preg-match,pcre,Php,Utf 8,Preg Replace,Preg Match,Pcre,我知道,PHP PCRE函数将字符串视为字节序列,因此许多站点建议使用/u修饰符来处理输入,并将正则表达式视为UTF-8 但是,我真的总是需要这个吗?我的测试表明,当我不使用转义序列、点或类似的东西时,这个标志没有任何区别 比如说 preg_match('/^[\da-f]{40}$/',$string)检查字符串是否具有SHA1哈希格式 preg_替换('/[^a-zA-Z0-9]/',$spacer,$string)替换每个非ASCII字母或数字的字符 preg\u replace('/^\
/u
修饰符来处理输入,并将正则表达式视为UTF-8
但是,我真的总是需要这个吗?我的测试表明,当我不使用转义序列、点或类似的东西时,这个标志没有任何区别
比如说
preg_match('/^[\da-f]{40}$/',$string)
检查字符串是否具有SHA1哈希格式
preg_替换('/[^a-zA-Z0-9]/',$spacer,$string)
替换每个非ASCII字母或数字的字符
preg\u replace('/^\+\(.*)$/','\1',$string)用于获取+(XYZ)
这些正则表达式只包含单字节ASCII符号,因此无论编码如何,它都应该在每个输入上工作,不是吗?请注意,第三个正则表达式使用点运算符,但由于我在字符串的开头和结尾处截断了一些ASCII字符,这应该也适用于UTF-8,对吗
谁能告诉我,如果我忽略了什么
u(PCRE_UTF8)
此修饰符打开与Perl不兼容的PCRE的附加功能。模式和主题字符串被视为UTF-8。无效的主题将导致preg_*函数不匹配;无效模式将触发级别E_警告错误。自PHP 5.3.4(分别为PCRE 7.3 2007-08-28)以来,五个和六个八位组UTF-8序列被视为无效;以前,这些被认为是有效的UTF-8
当您必须比较Unicode字符(如韩文或日文)时,您将需要此功能
换句话说,除非您不比较非Unicode的字符串(如英语),否则不需要使用此标志。第一个表达式没有问题。被量化的字符是显式的单字节字符,不能出现在UTF-8多字节序列中
第二个表达式可能会提供比预期更多的间隔符;例如:
echo preg_替换('/[^a-zA-Z0-9]/',“0”,“非Unicode字符串(如英语)”-“天真的未婚夫喜欢哈根达斯”:但这意味着,我只能使用u
修饰符,如果我绝对确定我处理用户输入?即,在二进制文件中匹配时,这将失败?您通常不会对非文本数据(如编译代码、zip文件或图像)使用regexp;并且应该始终在文本数据上使用Unicode,除非您有一个传统系统阻止您这样做,或者您有一个时间关键型系统,您负担不起多字节编码的开销(在这种情况下,您肯定不会使用PHP)。在这个时代,几乎没有任何理由不使用Unicode。还有一个问题:当丢弃字符/字节时,第二个表达式可能不是问题(即当$spacer='';时用空字符串替换)?是的,第二个的唯一问题是它将替换每个字节而不是每个字符。如果不替换任何内容,则不会出现问题,因为1*0==3*0
。