30

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

4

5 回答 5

31

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" 被视为单个字母。

于 2009-11-19T21:41:07.687 回答
27

PCRE 可以支持 UTF-8 和其他 Unicode 编码,但必须在编译时指定。从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 库,它似乎已配置为支持 Unicode 属性和 UTF-8。5.3 分支也一样。

于 2009-11-19T21:06:46.873 回答
2

不,他们不是。例如,请参阅PHP中的 preg_match 和 UTF-8 问题。

于 2009-11-19T21:03:28.020 回答
1

不,您需要使用多字节字符串函数,例如mb_ereg

于 2009-11-19T21:03:47.850 回答
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);

这些变化看起来好吗?

于 2009-11-19T22:21:50.563 回答