PHP 正则匹配中文-阿里云开发者社区

开发者社区> progpark> 正文

PHP 正则匹配中文

简介: 在做表单验证时对用户姓名的验证规则有以下要求 要求:输入的内容需要满足的条件是: 1、允许输入字符:数字(0-9)、字母(a-z和A-Z)、汉字、下划线(_)、圆点(.)和空格; 2、姓名中间允许有空格; 3、下划线、圆点和空格均为英文状态输入法下的字符; 4、姓名前后不允许输入下划线、圆
+关注继续查看

在做表单验证时对用户姓名的验证规则有以下要求
要求:输入的内容需要满足的条件是:

1、允许输入字符:数字(0-9)、字母(a-z和A-Z)、汉字、下划线(_)、圆点(.)和空格;
2、姓名中间允许有空格;
3、下划线、圆点和空格均为英文状态输入法下的字符;
4、姓名前后不允许输入下划线、圆点、空格和特殊字符

$str = 'abc测试 ef';
if (preg_match('/^[a-zA-Z0-9\u4e00-\u9fa5]+$|^[a-zA-Z0-9\u4e00-\u9fa5][a-zA-Z0-9_\s\ \u4e00-\u9fa5\.]*[a-zA-Z0-9\u4e00-\u9fa5]+$/', $str)) {
   echo "符合验证规则";
} else {
   echo "不符合验证规则";
}

执行时报错:Severity: Warning

Message: preg_match() [function.preg-match]: Compilation failed: PCRE does not support \L, \l, \N{name}, \U, or \u at offset 12
错误的大概意思是:preg_match()[函数。):编译失败:PCRE不支持\L, \I, \N{名称}, \U或\u

后来试了几次,发现表达式中"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编码下用正则表达式匹配汉字的最终正确表达式是:

/^[\x{4e00}-\x{9fa5}]+$/u

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

if (preg_match('/^[a-zA-Z0-9\x{4e00}-\x{9fa5}]+$|^[a-zA-Z0-9\x{4e00}-\x{9fa5}][a-zA-Z0-9_\s\ \x{4e00}-\x{9fa5}\.]*[a-zA-Z0-9\x{4e00}-\x{9fa5}]+$/u', $str)) {
    echo "符合验证规则";
} else {
    echo "不符合验证规则";
}

注:表达式的最后也要加上‘u’
最后没有再报错并且正则匹配成功了。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
php utf-8编码 正则匹配中文
首先unicode里面 中文的区域的0x4e00-0x9fa5 在java或者js这种已unicode编码处理字符串的编程语言中 /^[\u4e00-\u9fa5]+$/就可以判断一个字符串是否全部为中文 那么php...
810 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
4477 0
python正则表达式匹配中文
# -*- coding: utf-8 -*- import re def findPart(regex, text, name): res=re.findall(regex, text) if res: print "There are %d %s par...
725 0
PHP中利用文件锁实现日志写入和网站接口访问等常见场景下的并发控制
针对并发环境下网站、日志文件写入产生的脏数据、更新丢失等情况的解决思路之一
2587 0
+关注
progpark
PHP技术经理一枚
10
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载