PHP preg_functions多字节安全吗?

2022-08-30 14:34:07

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


答案 1

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


答案 2

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 分支也是如此。


推荐