PHP正则匹配汉字

妖尾巴 · · 50 次点击 · · 开始浏览    

我使用正则表达式来匹配中问的时候,出现了无法匹配的问题,问题如下

PCRE does not support \L, \l, \N{name}, \U, or \u at offset 2

我原来的匹配公式是:

/[\u4e00-\x9fa5]/

然后我在网上找的,下面的解决方案

解决后的匹配方案是:

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

下面是具体文章

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

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’ 最后没有再报错并且正则匹配成功了。

本文来自:开源中国博客

感谢作者:妖尾巴

查看原文:PHP正则匹配汉字

50 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet