php正则表达匹配中文问题分析小结


Posted in PHP onMarch 25, 2012
$str = '中华人民共和国123456789abcdefg'; 
echo preg_match("/^[u4e00-u9fa5_a-zA-Z0-9]{3,15}$",$strName);

运行一下上面这段代码,看会有什么提示信息?

Warning: preg_match(): Compilation failed: PCRE does not support L, l, N, P, p, U, u, or X at offset 3 in F:wwwrootphptest.php on line 2
原来,PHP正则表达式中不支持下列 Perl 转义序列:L, l, N, P, p, U, u, or X

在 UTF-8 模式下,允许用“x{...}”,花括号中的内容是表示十六进制数字的字符串。

原来的十六进制转义序列 xhh 如果其值大于 127 的话则匹配了一个双字节 UTF-8 字符。
所以,
可以这样来解决

preg_match("/^[x80-xff_a-zA-Z0-9]{3,15}$",$strName); 
preg_match('/[x{2460}-x{2468}]/u', $str);

匹配 内码汉字
按照他提供的方式进行测试,代码如下:

$str = "php编程"; 
if (preg_match("/^[x{2460}-x{2468}]+$/u",$str)) { 
print("该字符串全部是中文"); 
} else { 
print("该字符串不全部是中文"); 
}

发现这次依然对是否为中文判断失常。不过,既然x表示的十六进制数据,为什么和js里边提供的范围x4e00-x9fa5不一样呢?于是我就换成了下边的代码:

$str = "php编程"; 
if (preg_match("/^[x4e00-x9fa5]+$/u",$str)) { 
print("该字符串全部是中文"); 
} else { 
print("该字符串不全部是中文"); 
}

本来以为铁定成功了的事情,没想到,warning又一次产生了:
Warning: preg_match() [function.preg-match]: Compilation failed: invalid UTF-8 string at offset 6 in test.php on line 3

看来又有错误的表达方式了,于是对照了一下那篇文章的表达方式,给“4e00”和“9fa5”两边分别用"{"和“}”包起来,跑了一遍,发现真的准确了:

$str = "php编程"; 
if (preg_match("/^[x{4e00}-x{9fa5}]+$/u",$str)) { 
print("该字符串全部是中文"); 
} else { 
print("该字符串不全部是中文"); 
}

知道了php中utf-8编码下用正则表达式匹配汉字的最终正确表达式——/^[x{4e00}-x{9fa5}]+$/u,

最后总结出

//if (preg_match(“/^[".chr(0xa1)."-".chr(0xff)."]+$/”, $str)) { //只能在GB2312情况下使用 
if (preg_match(“/^[x7f-xff]+$/”, $str)) { //兼容gb2312,utf-8 
echo “正确输入”; 
} else { 
echo “错误输入”; 
}

双字节字符编码范围

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 (日文)

PHP 相关文章推荐
php xml常用函数的集合(比较详细)
Jun 06 PHP
thinkphp模板的包含与渲染实例分析
Nov 26 PHP
php天翼开放平台短信发送接口实现方法
Dec 22 PHP
PHP中require和include路径问题详解
Dec 25 PHP
避免Smarty与CSS语法冲突的方法
Mar 02 PHP
php数组索引与键值操作技巧实例分析
Jun 24 PHP
php分页原理 分页代码 分页类制作教程
Sep 23 PHP
PHP array_reduce()函数的应用解析
Oct 28 PHP
Laravel框架表单验证操作实例分析
Sep 30 PHP
PHP实现单条sql执行多个数据的insert语句方法
Oct 11 PHP
phpstudy后门rce批量利用脚本的实现
Dec 12 PHP
PHP配置文件php.ini中打开错误报告的设置方法
Jan 09 PHP
二招解决php乱码问题
Mar 25 #PHP
php引用地址改变变量值的问题
Mar 23 #PHP
奇怪的PHP引用效率问题分析
Mar 23 #PHP
php地址引用(php地址引用的效率问题)
Mar 23 #PHP
PHP遍历数组的几种方法
Mar 22 #PHP
php遍历数组的方法分享
Mar 22 #PHP
php中大括号作用介绍
Mar 22 #PHP
You might like
全国FM电台频率大全 - 26 西藏自治区
2020/03/11 无线电
一个PHP日历程序
2006/12/06 PHP
PHP Mysql编程之高级技巧
2008/08/27 PHP
PHP下一个非常全面获取图象信息的函数
2008/11/20 PHP
两个强悍的php 图像处理类1
2009/06/15 PHP
thinkphp中多表查询中防止数据重复的sql语句(必看)
2016/09/22 PHP
Yii2实现多域名跨域同步登录退出
2017/02/04 PHP
不用锚点也可以平滑滚动到页面的指定位置实现代码
2013/05/08 Javascript
jquery实现的代替传统checkbox样式插件
2015/06/19 Javascript
BootStrop前端框架入门教程详解
2016/12/25 Javascript
JS操作时间 - UNIX时间戳的简单介绍(必看篇)
2017/08/16 Javascript
利用nvm管理多个版本的node.js与npm详解
2017/11/02 Javascript
使用vue-cli打包过程中的步骤以及问题的解决
2018/05/08 Javascript
解决vue项目中出现Invalid Host header的问题
2020/11/17 Javascript
python三元运算符实现方法
2013/12/17 Python
Python导出DBF文件到Excel的方法
2015/07/25 Python
Python3.7基于hashlib和Crypto实现加签验签功能(实例代码)
2019/12/04 Python
python argparse传入布尔参数false不生效的解决
2020/04/20 Python
Python是什么 Python的用处
2020/05/26 Python
浅谈python锁与死锁问题
2020/08/14 Python
基于python实现图片转字符画代码实例
2020/09/04 Python
Python jieba结巴分词原理及用法解析
2020/11/05 Python
5 个强大的HTML5 API 函数推荐
2014/11/19 HTML / CSS
天游软件面试
2013/11/23 面试题
公司周年庆典邀请函
2014/01/12 职场文书
公司中秋节活动方案
2014/02/12 职场文书
初级会计求职信范文
2014/02/15 职场文书
大学四年个人的自我评价
2014/02/26 职场文书
禁毒宣传活动总结
2014/08/26 职场文书
教师拔河比赛广播稿
2014/10/14 职场文书
房地产销售经理岗位职责
2015/02/02 职场文书
入党自荐书范文
2015/03/05 职场文书
公司行政管理制度范本
2015/08/05 职场文书
pytorch 预训练模型读取修改相关参数的填坑问题
2021/06/05 Python
手把手教你实现PyTorch的MNIST数据集
2021/06/28 Python
解析mybatis-plus中的resultMap简单使用
2021/11/23 Java/Android