天天看点

PHP 正则匹配中文

在做表单验证时对用户姓名的验证规则有以下要求

要求:输入的内容需要满足的条件是:

1、允许输入字符:数字(0-9)、字母(a-z和a-z)、汉字、下划线(_)、圆点(.)和空格;

2、姓名中间允许有空格;

3、下划线、圆点和空格均为英文状态输入法下的字符;

4、姓名前后不允许输入下划线、圆点、空格和特殊字符

执行时报错:severity: warning

后来试了几次,发现表达式中"u4e00-u9fa5" 匹配中文时出问题了,正常情况下匹配中文是这样写的啊,所以很纳闷,于是在网上搜了搜发现在php中 不支持这样的表达式匹配中文

网上在一篇“模式修正符”的文章中介绍到:

u(pcre_utf8)

此修正符启用了一个 pcre 中与 perl 不兼容的额外功能。模式字符串被当成 utf-8。本修正符在 unix 下自 php 4.1.0 起可用,在 win32 下自 php 4.2.3 起可用。自 php 4.3.5 起开始检查模式的 utf-8 合法性。

既然是不兼容,那php中是如何匹配到中文呢?

仔细查了查发现php中utf-8编码下用正则表达式匹配汉字的最终正确表达式是:

于是将“u4e00-u9fa5”替换成“x{4e00}-x{9fa5}”进行尝试。

注:表达式的最后也要加上‘u’

最后没有再报错并且正则匹配成功了。