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数据缓存技术
Feb 14 PHP
一些常用的php简单命令代码集锦
Sep 24 PHP
PHP 文件上传进度条的两种实现方法的代码
Nov 25 PHP
用PHP程序实现支持页面后退的两种方法
Jun 30 PHP
PHP 木马攻击防御技巧
Jun 13 PHP
php中的boolean(布尔)类型详解
Oct 28 PHP
php强制运行广告的方法
Dec 01 PHP
PHP中使用Imagick读取pdf并生成png缩略图实例
Jan 21 PHP
浅析ThinkPHP缓存之快速缓存(F方法)和动态缓存(S方法)(日常整理)
Oct 26 PHP
PHP计算数组中值的和与乘积的方法(array_sum与array_product函数)
Apr 01 PHP
Laravel中间件实现原理详解
Oct 09 PHP
PHP设计模式之建造者模式定义与用法简单示例
Aug 13 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
COM in PHP (winows only)
2006/10/09 PHP
用mysql触发器自动更新memcache的实现代码
2009/10/11 PHP
laravel5 Eloquent 实现事务方式
2019/10/21 PHP
laravel清除视图缓存的代码
2019/10/23 PHP
关于使用runtimeStyle属性问题讨论文章
2007/03/08 Javascript
javascript表单验证 - Parsley.js使用和配置
2013/01/25 Javascript
JQuery对id中含有特殊字符的转义处理示例
2013/09/06 Javascript
使用insertAfter()方法在现有元素后添加一个新元素
2014/05/28 Javascript
jQuery的:parent选择器定义和用法
2014/07/01 Javascript
修复bash漏洞的shell脚本分享
2014/12/31 Javascript
Jquery中CSS选择器用法分析
2015/02/10 Javascript
微信小程序  audio音频播放详解及实例
2016/11/02 Javascript
浅析JavaScript中作用域和作用域链
2016/12/06 Javascript
jQuery遍历节点方法汇总(推荐)
2017/05/13 jQuery
JS实现的汉字与Unicode码相互转化功能分析
2018/05/25 Javascript
javascrit中undefined和null的区别详解
2019/04/07 Javascript
微信小程序webview 脚手架使用详解
2019/07/22 Javascript
JavaScript字符串处理常见操作方法小结
2019/11/15 Javascript
js+css实现全屏侧边栏
2020/06/16 Javascript
使用python统计文件行数示例分享
2014/02/21 Python
简单总结Python中序列与字典的相同和不同之处
2016/01/19 Python
python验证码识别教程之利用投影法、连通域法分割图片
2018/06/04 Python
Python将文本去空格并保存到txt文件中的实例
2018/07/24 Python
Python神奇的内置函数locals的实例讲解
2019/02/22 Python
Flask教程之重定向与错误处理实例分析
2019/08/01 Python
Python爬取智联招聘数据分析师岗位相关信息的方法
2019/08/13 Python
解决python 找不到module的问题
2020/02/12 Python
python中温度单位转换的实例方法
2020/12/27 Python
html5+css3气泡组件的实现
2014/11/21 HTML / CSS
HTML5中meta属性的使用方法
2016/02/29 HTML / CSS
如何设置Java的运行环境
2013/04/05 面试题
廉政教育心得体会
2014/01/01 职场文书
小学教师师德反思
2014/02/03 职场文书
销售求职信范文
2014/05/26 职场文书
参赛口号
2014/06/16 职场文书
庆祝教师节新闻稿
2015/07/17 职场文书