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下实现农历日历的代码
Mar 07 PHP
PHP Memcached应用实现代码
Feb 08 PHP
php中0,null,empty,空,false,字符串关系的详细介绍
Jun 20 PHP
PHP图片上传代码
Nov 04 PHP
php smarty truncate UTF8乱码问题解决办法
Jun 13 PHP
百度工程师讲PHP函数的实现原理及性能分析(一)
May 13 PHP
老版本PHP转义Json里的特殊字符的函数
Jun 08 PHP
常见的四种POST 提交数据方式(小总结)
Oct 08 PHP
深入解析PHP的Yii框架中的缓存功能
Mar 29 PHP
php数据库的增删改查 php与javascript之间的交互
Aug 31 PHP
PHP实现的贪婪算法实例
Oct 17 PHP
Thinkphp 框架基础之源码获取、环境要求与目录结构分析
Apr 27 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
重新封装zend_soap实现http连接安全认证的php代码
2011/01/12 PHP
php数组函数序列 之array_count_values() 统计数组中所有值出现的次数函数
2011/10/29 PHP
ThinkPHP关于session的操作方法汇总
2014/07/18 PHP
php去除头尾空格的2种方法
2015/03/16 PHP
PHP中利用sleep函数实现定时执行功能实现代码
2016/08/25 PHP
PHP Mysqli 常用代码集合
2016/11/12 PHP
万能的php分页类
2017/07/06 PHP
jquery中this的使用说明
2010/09/06 Javascript
基于jQuery的倒计时插件代码
2011/05/07 Javascript
利用jq让你的div居中的好方法分享
2013/11/21 Javascript
JS按回车键实现登录的方法
2014/08/25 Javascript
深入理解javascript构造函数和原型对象
2014/09/23 Javascript
jQuery检测输入的字符串包含的中英文的数量
2015/04/17 Javascript
使用AngularJS实现可伸缩的页面切换的方法
2015/06/19 Javascript
基于JavaScript实现快速转换文本语言(繁体中文和简体中文)
2016/03/07 Javascript
详解javascript中对数据格式化的思考
2017/01/23 Javascript
js经验分享 JavaScript反调试技巧
2018/03/10 Javascript
vue文件树组件使用详解
2018/03/29 Javascript
vue 点击按钮增加一行的方法
2018/09/07 Javascript
JavaScript循环遍历你会用哪些之小结篇
2018/09/28 Javascript
vue视图不更新情况详解
2019/05/16 Javascript
微信小程序自定义胶囊样式
2020/12/27 Javascript
[14:50]2018DOTA2亚洲邀请赛开幕式
2018/04/03 DOTA
python打开网页和暂停实例
2014/09/30 Python
python 正则表达式参数替换实例详解
2020/01/17 Python
Python短信轰炸的代码
2020/03/25 Python
vscode写python时的代码错误提醒和自动格式化的方法
2020/05/07 Python
python主要用于哪些方向
2020/07/05 Python
CSS实现的一闪而过的图片闪光效果
2014/04/23 HTML / CSS
TheFork葡萄牙:欧洲领先的在线餐厅预订平台
2019/05/27 全球购物
简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程
2016/01/06 面试题
学校机关党总支领导班子整改工作方案
2014/10/26 职场文书
2014年行政部工作总结
2014/11/19 职场文书
Angular性能优化之第三方组件和懒加载技术
2021/05/10 Javascript
Python数据类型最全知识总结
2021/05/31 Python
使用 Apache 反向代理的设置技巧
2022/01/18 Servers