PHP preg_functions是否是多字节安全的?

PHP中没有可用的多字节“preg”函数,那么这是否意味着默认的preg_functions是安全的? 在php文档中找不到任何提及。

PCRE可以支持UTF-8和其他Unicode编码,但必须在编译时指定。 从PCRE 8.0的手册页 :

PCRE的当前实现大致对应于Perl 5.10,包括对UTF-8编码string和Unicode通用类别属性的支持。 但是,UTF-8和Unicode支持必须明确启用; 这不是默认的。 Unicode表对应于Unicode版本5.1。

PHP目前使用PCRE 7.9 ; 你的系统可能有一个旧版本。

看一下PHP 5.2附带的PCRE库 ,它似乎被configuration为支持Unicode属性和UTF-8。 5.3分支也一样 。

pcre支持utf8开箱即用,请参阅“u”修饰符的文档。

插图(\ xC3 \ xA4是德文字母“ä”的utf8编码)

echo preg_replace('~\w~', '@', "a\xC3\xA4b"); 

这与“@@¤@”相呼应,因为“\ xC3”和“\ xA4”被视为不同的符号

  echo preg_replace('~\w~u', '@', "a\xC3\xA4b"); 

(注意“u”)打印“@@@”,因为“\ xC3 \ xA4”被视为单个字母。

不,他们不是。 例如, 在PHP中查看preg_match和UTF-8的问题。

不,你需要使用像mb_ereg这样的多字节string函数

我的一些更复杂的preg函数:

(1a)validation用户名为字母数字+下划线:

 preg_match('/^[A-Za-z][A-Za-z0-9]*(?:_[A-Za-z0-9]+)*$/',$username) 

(1b)可能的UTF替代scheme:

 preg_match('/^[A-Za-z][A-Za-z0-9]*(?:_[A-Za-z0-9]+)*$/u',$username) 

(2a)validation电子邮件:

 preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[az]{2,6}$/ix",$email)) 

(2b)可能的UTF替代方法:

 preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[az]{2,6}$/ixu",$email)) 

(3a)使换行符正常化:

 preg_replace("/(\n){2,}/","\n\n",$str); 

(3b)可能的UTF替代方法:

 preg_replace("/(\n){2,}/u","\n\n",$str); 

做这些改变看起来好吗?