PHP正则匹配中文
编辑时间:2019-03-14 18:09:05 作者:666666

本文转自:http://blog.sina.com.cn/s/blog_8122f6b70101hifb.html

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

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,L \ N {名称},\ U,或\ U在抵消12

后来试了几次,发现表达式中"\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’
最后没有再报错并且正则匹配成功了。
 点赞 2
 收藏 0
 分享
来说两句吧
最新评论
    暂无评论
天气预报
万年历
2015年
7月
返回今天

博客声明

本博客属个人所有,不涉及商业目的。遵守中华人民共和国法律法规、中华民族基本道德和基本网络道德规范,尊重有节制的言论自由和意识形态自由,反对激进、破坏、低俗、广告、投机等不负责任的言行。所有转载的文撰写页面章、图片仅用于说明性目的,被要求或认为适当时,将标注署名与来源。避免转载有明确“不予转载”声明的作品。若不愿某一作品被转用,请及时通知本人。对于无版权或自由版权作品,本博客有权进行修改和传播,一旦涉及实质性修改,本博客将对修改后的作品享有相当的版权。二次转载者请再次确认原作者所给予的权力范围。

本博客所有原创作品,包括文字、资料、图片、网页格式,转载时请标注作者与来源。非经允许,不得用于赢利目的。本博客受中国知识产权、互联网法规和知识共享条例保护和保障,任何人不得进行旨在破坏或牟取私利的行为。本博客声明以简体中文版为准,不对其他语言版本负责。

如有侵权请及时联系我进行处理。邮箱youseeim666@163.com