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 文件上传模型,支持多文件上传
Aug 13 PHP
PHP var_dump遍历对象属性的函数与应用代码
Jun 04 PHP
php下统计用户在线时间的一种尝试
Aug 26 PHP
解析:php调用MsSQL存储过程使用内置RETVAL获取过程中的return值
Jul 03 PHP
ThinkPHP实现将SESSION存入MYSQL的方法
Jul 22 PHP
PHP正则替换函数preg_replace和preg_replace_callback使用总结
Sep 22 PHP
CI框架装载器Loader.php源码分析
Nov 04 PHP
PHP生成条形图的方法
Dec 10 PHP
php备份数据库类分享
Apr 14 PHP
PHP设计模式之原型设计模式原理与用法分析
Apr 25 PHP
php 中htmlentities导致中文无法查询问题
Sep 10 PHP
PHP面向对象程序设计之接口的继承定义与用法详解
Dec 20 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来写记数器(详细介绍)
2006/10/09 PHP
PHP 安全检测代码片段(分享)
2013/07/05 PHP
PHP数据过滤的方法
2013/10/30 PHP
WordPress中制作导航菜单的PHP核心方法讲解
2015/12/11 PHP
实现PHP搜索加分页
2016/10/12 PHP
laravel实现按时间日期进行分组统计方法示例
2019/03/23 PHP
PHP7变量处理机制修改
2021/03/09 PHP
JavaScript CSS修改学习第五章 给“上传”添加样式
2010/02/19 Javascript
jquery parent和parents的区别分析
2013/10/02 Javascript
jQuery简单实现遍历数组的方法
2015/04/14 Javascript
js代码实现点击按钮出现60秒倒计时
2021/01/28 Javascript
走进javascript——不起眼的基础,值和分号
2017/02/24 Javascript
angularjs定时任务的设置与清除示例
2017/06/02 Javascript
vue使用drag与drop实现拖拽的示例代码
2017/09/07 Javascript
iframe高度自适应及隐藏滚动条的实例详解
2017/09/29 Javascript
详解Vue的钩子函数(路由导航守卫、keep-alive、生命周期钩子)
2018/07/24 Javascript
JavaScript实现数组全排列、去重及求最大值算法示例
2018/07/30 Javascript
react koa rematch 如何打造一套服务端渲染架子
2019/06/26 Javascript
layui form表单提交后实现自动刷新
2019/10/25 Javascript
[47:53]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#2COL VS Spirit
2016/03/02 DOTA
[04:45]DOTA2上海特级锦标赛主赛事第四日RECAP
2016/03/06 DOTA
[05:06]DOTA2-DPC中国联赛 正赛 VG vs Magma选手采访
2021/03/11 DOTA
Python算法应用实战之队列详解
2017/02/04 Python
对numpy Array [: ,] 的取值方法详解
2018/07/02 Python
Python批量修改图片分辨率的实例代码
2019/07/04 Python
Html5实现如何在两个div元素之间拖放图像
2013/03/29 HTML / CSS
HTML5自定义mp3播放器源码
2020/01/06 HTML / CSS
英国领先的豪华时尚家居网上商店:Amara
2019/08/12 全球购物
南京迈特望C/C++面试题
2012/07/09 面试题
传播学专业毕业生自荐信
2013/11/04 职场文书
上班迟到检讨书300字
2014/10/18 职场文书
2014年团支部年度工作总结
2014/12/24 职场文书
致我们终将逝去的青春观后感
2015/06/10 职场文书
Python Parser的用法
2021/05/12 Python
为什么MySQL 删除表数据 磁盘空间还一直被占用
2021/10/16 MySQL
PostgreSQL 插入INSERT、删除DELETE、更新UPDATE、事务transaction
2022/04/12 PostgreSQL