PHP preg_functions多字节是否安全?

时间:2009-11-19 20:58:39

标签: php preg-replace preg-match multibyte

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

5 个答案:

答案 0 :(得分:26)

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”被视为一个字母。

答案 1 :(得分:25)

PCRE可以支持UTF-8和其他Unicode编码,但必须在编译时指定。来自man page for PCRE 8.0

  

PCRE的当前实现大致与Perl 5.10相对应,包括对UTF-8编码字符串和Unicode常规类别属性的支持。但是,必须明确启用UTF-8和Unicode支持;它不是默认值。 Unicode表对应于Unicode 5.1版。

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

看一下PHP 5.2附带的PCRE lib,它似乎被配置为支持Unicode属性和UTF-8。 5.3 branch也是如此。

答案 2 :(得分:1)

不,他们不是。例如,请参阅问题preg_match and UTF-8 in PHP

答案 3 :(得分:1)

不,您需要使用multibyte string functions之类的mb_ereg

答案 4 :(得分:1)

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

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

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

(1b)可能的UTF替代方案:

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

(2a)验证电子邮件:

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

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

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

(3a)规范换行:

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

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

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

这些变化看起来没问题吗?