php-preg_replace:用于ascii字符串的unicode修饰符


php preg_replace: unicode modifier for ascii strings

我需要使用正则表达式处理php脚本中的字符串。但有一个问题——不同的字符串有不同的编码。若字符串仅包含ascii符号,则mb_detect_encoding函数返回"ascii"。但若字符串包含俄语符号,例如,mb_detect_encoding会返回"UTF-8"。我想手动检查每个字符串的编码不是一个好主意。所以问题是,对ascii字符串使用preg_replace(带unicode修饰符)正确吗?为ascii和utf-8字符串编写这样的代码preg_replace ("/[^_a-z]/u","",$string);正确吗?

如果这两个选项是"UTF-8"或"ASCII",这不会有问题,但事实并非如此。

如果PHP不使用UTF-8,则使用ISO-8859-1,不是ASCII(这是ASCII的超集,因为前127个字符。它是ASCII的一个超集。一些字符,例如瑞典语字符åäö,可以用ISO-8859-1和Unicode表示,具有不同的代码点!我认为这对preg_*函数来说无关紧要,所以它可能不适用于您的问题,但在处理不同的en时请记住这一点。)编码。

你真的,真的应该试着知道你的字符串在哪个字符集中,而不需要mb_detect_encoding的魔力(mb_detect_encoding不是一个保证,只是一个很好的猜测)。例如,通过HTTP获取的字符串在HTTP标头中确实指定了一个字符集。

当然,您可以始终使用Unicode修饰符,它既不会影响结果也不会影响性能。

7位ASCII字符集以UTF-8进行相同编码。如果你有一个ASCII字符串,你应该能够在上面使用PREG"u"修饰符。

但是,如果您有一个"补充"的8位ASCII字符集,如ISO-8859-1、Windows-1252或HP-Roman8,则最左边的位集(值x80-xff)的字符在UTF-8中的编码不相同,因此不适合使用PREG"u"修饰符。