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

目录
相关文章
|
9月前
|
Java PHP C++
PHP快速入门09-正则相关,附一定要学会的20个高频使用案例
PHP快速入门09-正则相关,附一定要学会的20个高频使用案例
|
11月前
|
PHP
PHP正则匹配中文
PHP正则匹配中文
|
PHP
PHP手机号验证正则
PHP手机号验证正则
105 0
PHP正则匹配字符串只能包含数字、字符串、下划线
//列子 $string = ' abc_123@c c!'; //去除字符串所有空格(结果为'abc_123@cc!') $string = preg_replace('# #','',$string); //验证字符串是否只包含数字和字母以及下划线 $res = preg_match("/^[a-zA-Z0-9_]+$/",$string); //如果不符合正则表达式规则,则抛出异常 if (!$res){ //自定义异常类 throw new OperationException([ 'errorCode'=>999,
|
PHP
PHP利用正则实现手机号中间四位****
PHP利用正则实现手机号中间四位****
88 0
|
存储 JavaScript 前端开发
JavaScript与PHP中正则
有个在线调试正则的工具,点击查看工具。下面的所有示例代码,都可以在codepen上查看到。
JavaScript与PHP中正则
|
PHP Perl
PHP中文正则
编辑个人资料模块规则验证
126 0
PHP中文正则
|
PHP
PHP面试题:对于用户输入一串字符串$string,要求$string中只能包含大于0的数字和英文逗号,请用正则 表达式验证,对于不符合要求的$string返回出错信息
PHP面试题:对于用户输入一串字符串$string,要求$string中只能包含大于0的数字和英文逗号,请用正则 表达式验证,对于不符合要求的$string返回出错信息
121 0
|
PHP
PHP字符串学习之利用正则过滤字符,返回数字字符
在之前的文章《PHP字符串学习之怎么去除其他字符,只留下数字》中,我们介绍了利用for循环和in_array()或is_numeric()函数来提取字符串中数字字符的方法。这次我们继续PHP字符串的学习与练习,介绍一下提取字符串中数字字符的另几种方法。 提取字符串中数字字符,本质上就是字符串过滤操作。看到字符串过滤,我就想起了 “正则表达式”。
330 0
|
PHP
一道ISCC题引申的PHP正则复习
iscc中的一道web题“试试看”,描述为随意开火 image.png 起初看url,以为是一道常规的文件包含题,后面试了很多方法都出不来 最后受到其他师傅的启发才得到payload 这里有两种payload都可以 http://118.
1066 0