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

目录
相关文章
|
6月前
|
存储 程序员 PHP
老程序员分享:Php中正则小结(一)
老程序员分享:Php中正则小结(一)
31 0
|
6月前
|
SQL 监控 安全
代码审计-PHP原生开发篇&SQL注入&数据库监控&正则搜索&文件定位&静态分析
代码审计-PHP原生开发篇&SQL注入&数据库监控&正则搜索&文件定位&静态分析
|
7月前
|
PHP
php 正则匹配 常用的 规则(一) 匹配form表单
php 正则匹配 常用的 规则(一) 匹配form表单
36 0
|
7月前
|
PHP
php 正则匹配 规则(二)匹配form表单 示例
php 正则匹配 规则(二)匹配form表单 示例
40 0
|
Java PHP C++
PHP快速入门09-正则相关,附一定要学会的20个高频使用案例
PHP快速入门09-正则相关,附一定要学会的20个高频使用案例
PHP正则匹配中文
PHP正则匹配中文
|
存储 JavaScript 前端开发
JavaScript与PHP中正则
有个在线调试正则的工具,点击查看工具。下面的所有示例代码,都可以在codepen上查看到。
JavaScript与PHP中正则
|
PHP Perl
PHP中文正则
编辑个人资料模块规则验证
148 0
PHP中文正则
|
PHP
PHP手机号验证正则
PHP手机号验证正则
127 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,