PHP 正则匹配中文

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

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

时间: 2024-11-02 16:41:25

PHP 正则匹配中文的相关文章

js实现正则匹配中文标点符号的方法_javascript技巧

本文实例讲述了js正则匹配中文标点符号的方法.分享给大家供大家参考,具体如下: 运行效果截图如下: 具体代码如下: <html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <title>js正则匹配中文标点符号</title> <head> <body> <input ty

PHP正则匹配中文字母数字正则表达式

 方法一  代码如下 if(preg_match("/^d*$/",   "4312")) { echo   "全数字 "; } if(preg_match("/^[a-z]*$/i",   "fdsFDfd")) { echo   "全字母 "; } if(preg_match("/^[a-zd]*$/i",   "fd4fd34")) { ec

中文匹配-bash中怎么匹配中文字符

问题描述 bash中怎么匹配中文字符 正则表达式[u4e00-u9fa5]在shell中为什么匹配不出中文,且在grep中报出grep:Invalid range end,我想在shell中匹配输入的中文该怎么做呢 解决方案 Bash 字符匹配正则匹配中文字符中文字符及其中文标点符号正则表达式匹配 解决方案二: 还要看bash是对中文如何编码的,不然没办法直接匹配.

PHP正则匹配字符串中的中文

我们先要明白 中文双字节字符编码范围 1. GBK (GB2312/GB18030) x00-xff GBK双字节编码范围 x20-x7f ASCII xa1-xff 中文 gb2312 x80-xff 中文 gbk 2. UTF-8 (Unicode) u4e00-u9fa5 (中文) x3130-x318F (韩文 xAC00-xD7A3 (韩文) u0800-u4e00 (日文) 获取指定的中文与字符 例1  代码如下 复制代码 <?php $str = '正则如何匹配中文字在某中文字符串

PHP 正则判定中文 UTF-8 &amp;GBK

UTF-8匹配:在javascript中,要判定字符串是中文是很简朴的.比如:var str = "php编程";if (/^[\u4e00-\u9fa5]+$/.test(str)) {alert("该字符串全部是中文");} else{alert("该字符串不全部是中文");}php中,是用 ... UTF-8匹配: 在javascript中,要判定字符串是中文是很简朴的.比如: var str = "php编程"; if

java匹配中文汉字的正则表达式

  代码如下   [u4E00-u9FA5]汉字?[uFE30-uFFA0]全角字符 [u4E00-u9FA5]汉字?[uFE30-uFFA0]全角字符 匹配中文字符的正则表达式: [u4e00-u9fa5] 匹配双字节字符(包括汉字在内):[^x00-xff] 应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1) 代码如下   String.prototype.len=function(){return this.replace([^x00-xff]/g,"aa").

javascript中使用正则计算中文长度的例子_javascript技巧

由于javascript是unicode编码的,所有的字符对于它来说一个就是一个,但是后台程序不是,通常在后台程序中一个中文是占两个字节的,这就导致了前后端校验长度不一致,这个问题可以通过正则来解决. 复制代码 代码如下: function getRealLen( str ) {    return str.replace(/[^\x00-\xff]/g, '__').length; //这个把所有双字节的都给匹配进去了} 附赠另一小则技巧: 有时候为了美观,不影响布局和界面,会以一些文案进行截

正则匹配闭合HTML标签(支持嵌套)

任何复杂的正则表达式都是由简单的子表达式组成的,要想写出复杂的正则来,一方面需要有化繁为简的功底,另外一方面,我们需要从正则引擎的角度去思考问题.关于正则引擎的原理,推荐<Mastering Regular Expression>中文名叫<精通正则表达式>.挺不错的一本书. OK,先确定我们要解决的问题--从一段Html文本中找出特定id的标签的innerHTML. 这里面最大的难点就是,Html标签是支持嵌套的,怎么能够找到指定标签相对应的闭合标签呢? 我们可以这样想,先匹配最前

求在字符串中匹配中文数字组合的java正则表达式

问题描述 求一个在字符串中识别 中文和数字组合的子串 的java方法,如用正则表达式来匹配.如何匹配? 中文和数字组合的子串 子串格式为:1.中文个数 为 3-6个字. 2.数字 可以固定在1-4位, 正则为d{1,4}. 3."号"字如"小镇100号""大街101号" 这种形式 输入为 1个字符串 s="我在小镇100号"; 输出为 result = "小镇100号"; 输入为 1个字符串 s="