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 相关文章推荐
关于文本留言本的分页代码
Oct 09 PHP
PHP Header用于页面跳转要注意的几个问题总结
Oct 03 PHP
解析thinkphp import 文件内容变量失效的问题
Jun 20 PHP
PHP中echo,print_r与var_dump区别分析
Sep 29 PHP
php中heredoc与nowdoc介绍
Dec 25 PHP
PHP callback函数使用方法和注意事项
Jan 23 PHP
必须收藏的23个php实用代码片段
Feb 02 PHP
Windows平台实现PHP连接SQL Server2008的方法
Jul 26 PHP
Laravel5.5新特性之友好报错以及展示详解
Aug 13 PHP
Laravel关系模型指定条件查询方法
Oct 10 PHP
Thinkphp 在api开发中异常返回依然是html的解决方式
Oct 16 PHP
laravel框架邮箱认证实现方法详解
Nov 22 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
让PHP支持断点续传的源码
2010/05/16 PHP
jQuery UI Datepicker length为空或不是对象错误的解决方法
2010/12/19 Javascript
JQuery中ajax方法访问web服务实例
2015/07/18 Javascript
javascript+canvas实现刮刮卡抽奖效果
2015/07/29 Javascript
JS操作COOKIE实现备忘记录的方法
2016/04/01 Javascript
微信小程序-获得用户输入内容
2017/02/13 Javascript
js实现无缝滚动图
2017/02/22 Javascript
JavaScript与Java正则表达式写法的区别介绍
2017/08/15 Javascript
vue实现a标签点击高亮方法
2018/03/17 Javascript
Angular6笔记之封装http的示例代码
2018/07/27 Javascript
[03:55]DOTA2完美大师赛选手传记——LFY.MONET
2017/11/18 DOTA
Python中的各种装饰器详解
2015/04/11 Python
Python 模拟购物车的实例讲解
2017/09/11 Python
Python2/3中urllib库的一些常见用法
2017/12/19 Python
python如何重载模块实例解析
2018/01/25 Python
python批量设置多个Excel文件页眉页脚的脚本
2018/03/14 Python
pycharm中成功运行图片的配置教程
2018/10/28 Python
python创建文件时去掉非法字符的方法
2018/10/31 Python
Python类和对象的定义与实际应用案例分析
2018/12/27 Python
Python 一键制作微信好友图片墙的方法
2019/05/16 Python
python使用mitmproxy抓取浏览器请求的方法
2019/07/02 Python
python基于FTP实现文件传输相关功能代码实例
2019/09/28 Python
Python转换itertools.chain对象为数组的方法
2020/02/07 Python
Jupyter Notebook的连接密码 token查询方式
2020/04/21 Python
新加坡网上化妆品店:Best Buy World
2018/05/18 全球购物
迷你分体式空调:SoGoodToBuy
2018/08/07 全球购物
全球最大的瓷器、水晶和银器零售商:Replacements
2020/06/15 全球购物
高中军训感言1000字
2014/03/01 职场文书
大学学生会竞选演讲稿
2014/04/25 职场文书
《悯农》教学反思
2014/04/28 职场文书
活动总结报告范文
2014/05/04 职场文书
庆祝教师节标语
2014/10/09 职场文书
合伙经营协议书范本(通用版)
2014/12/03 职场文书
2014幼儿园班主任工作总结
2014/12/04 职场文书
创业计划书之书店
2019/09/10 职场文书
深入浅析Redis 集群伸缩原理
2021/05/15 Redis