Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么时候我需要PHP正则表达式中的u-modifier?_Php_Utf 8_Preg Replace_Preg Match_Pcre - Fatal编程技术网

什么时候我需要PHP正则表达式中的u-modifier?

什么时候我需要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('/^\

我知道,PHP PCRE函数将字符串视为字节序列,因此许多站点建议使用
/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