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

有帮助吗?

解决方案

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;您的系统可能有旧版本。

看看 PCRE库 PHP 5.2 附带的,它似乎配置为支持 Unicode 属性和 UTF-8。同样对于 5.3 分支.

其他提示

PCRE支持UTF8开箱,见文档中的 'U' 改性剂。

插图(\ XC3 \ XA4为德国字母 “A” UTF8编码)

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

此相呼应 “@@ @¤”,因为 “\ XC3” 和 “\ XA4” 分别为不同的符号处理的

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

(注意 'U')打印 “@@@”,因为 “\ XC3 \ XA4” 被视为一个字母。

没有,它们不是。见的问题 的preg_match和UTF-8在PHP 例如

没有,您需要使用多字节字符串函数的像 mb_ereg

我的一些更复杂的预浸料的功能:

(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);

做thse改变一下好吗?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top