PHP preg_函数是多字节安全的吗?

PHP preg_函数是多字节安全的吗?,php,preg-replace,preg-match,multibyte,Php,Preg Replace,Preg Match,Multibyte,PHP中没有可用的多字节“preg”函数,那么这是否意味着默认的preg_函数都是mb安全的?在php文档中找不到任何提及。不,它们不是。例如,请参见问题。否,您需要使用类似的PCRE可以支持UTF-8和其他Unicode编码,但必须在编译时指定。从: PCRE的当前实现大约与Perl5.10相对应,包括对UTF-8编码字符串和Unicode通用类别属性的支持。但是,必须明确启用UTF-8和Unicode支持;这不是默认值。Unicode表对应于Unicode 5.1版 PHP目前使用;您的系统

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

不,它们不是。例如,请参见问题。

否,您需要使用类似的

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

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

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


看看PHP5.2附带的,它似乎被配置为支持Unicode属性和UTF-8。与此相同。

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

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

因为“\xC3”和“\xA4”被视为不同的符号,所以这会回显“@·@”

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

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

我的一些更复杂的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) 
preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ixu",$email))
preg_replace("/(\n){2,}/u","\n\n",$str);
(2a)验证电子邮件:

preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix",$email))
(2b)可能的UTF替代方案:

preg_match('/^[A-Za-z][A-Za-z0-9]*(?:_[A-Za-z0-9]+)*$/u',$username) 
preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ixu",$email))
preg_replace("/(\n){2,}/u","\n\n",$str);
(3a)规范化换行:

preg_replace("/(\n){2,}/","\n\n",$str);
(3b)可能的UTF替代方案:

preg_match('/^[A-Za-z][A-Za-z0-9]*(?:_[A-Za-z0-9]+)*$/u',$username) 
preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ixu",$email))
preg_replace("/(\n){2,}/u","\n\n",$str);

这些变化看起来还好吗?

我90%肯定底层的C函数是正确的,但我想这并不意味着PHP版本是正确的……它们是POSIX
ereg
函数的多字节版本,这与PCRE
preg
函数不完全相同。Ben S你是我的英雄:)我只是想净化文本并在文本中留下äöüß。preg_replace从未正确地执行此操作,但mb_ereg做到了!只要使用/u修饰符,它们就是多字节安全的,只要多字节编码是UTF-8。u引擎不支持UTF-8以外的任何其他编码。我正在使用PHP5.3.0,其中包括PCRE版本7.9。我检查了包含UTF8定义的PCRE config.h文件,因此preg_函数看起来是安全的。非常感谢您提供的信息!有没有一种快速的方法来确定现有PHP安装使用的是哪个版本的PCRE?例如,我的服务器运行的是PHP5.5,但我怎么知道它是用什么PCRE库编译的呢?真的吗?嗯,我对正则表达式字符串不太精通,如果你不介意的话,我可能会发布一些preg_uuu代码来看看你的想法?非常适合u修饰符,我不知道调用
preg_ureplace
后对字符串进行编码时出错,但是失败,因为
preg_replace
将一些UTF-8字符转换为替换字符。
u
修改器保存了我的一天!!!非常感谢。为了澄清这一点,
PREG\u OFFSET\u CAPTURE
产生字节偏移量而不是字符偏移量。它与PHP中的字符串处理是一致的,但可能会非常混乱。如果使用,可以使用
offset()
byteOffset()
方法来获取字符或字节的偏移量。我相信您的电子邮件正则表达式将允许电子邮件地址中的任何位置出现“…”,这是需要断言来防止的。