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小技巧之函数重载
Jun 02 PHP
PHP自带函数给数字或字符串自动补齐位数
Jul 29 PHP
php实现最简单的MVC框架实例教程
Sep 08 PHP
php ucwords() 函数将字符串中每个单词的首字符转换为大写(实现代码)
May 12 PHP
PHP如何实现订单的延时处理详解
Dec 30 PHP
PHP基于面向对象实现的留言本功能实例
Apr 04 PHP
PHP操作MongoDB实现增删改查功能【附php7操作MongoDB方法】
Apr 24 PHP
php中file_get_contents()函数用法实例
Feb 21 PHP
php中的buffer缓冲区用法分析
May 31 PHP
PHP中define() 与 const定义常量的区别详解
Jun 25 PHP
使用laravel指定日志文件记录任意日志
Oct 17 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
Home Coffee Roasting
2021/03/03 咖啡文化
PHP访问MYSQL数据库封装类(附函数说明)
2010/12/04 PHP
thinkphp微信开之安全模式消息加密解密不成功的解决办法
2015/12/02 PHP
利用php操作memcache缓存的基础方法示例
2017/08/02 PHP
jquery 最简单易用的表单验证插件
2010/02/27 Javascript
JS继承--原型链继承和类式继承
2013/04/08 Javascript
js清理Word格式示例代码
2014/02/13 Javascript
技术男用来对妹子表白的百度首页
2014/07/23 Javascript
jQuery中hide()方法用法实例
2014/12/24 Javascript
JavaScript原生对象之Date对象的属性和方法详解
2015/03/13 Javascript
jQuery实现的精美平滑二级下拉菜单效果代码
2016/03/28 Javascript
JavaScript 总结几个提高性能知识点(推荐)
2017/02/20 Javascript
微信小程序实战之自定义toast(6)
2017/04/18 Javascript
vue.js实现用户评论、登录、注册、及修改信息功能
2020/05/30 Javascript
r.js来合并压缩css文件的示例
2018/04/26 Javascript
详解Vue中的自定义指令
2020/12/07 Vue.js
Python生成随机密码
2015/03/10 Python
python魔法方法-属性访问控制详解
2016/07/25 Python
Python常用字符串替换函数strip、replace及sub用法示例
2018/05/21 Python
python实现将视频按帧读取到自定义目录
2019/12/10 Python
Python之Class&Object用法详解
2019/12/25 Python
详解python tcp编程
2020/08/24 Python
用CSS3实现无限循环的无缝滚动的实例代码
2017/07/04 HTML / CSS
css3 flex实现div内容水平垂直居中的几种方法
2020/03/27 HTML / CSS
一文彻底解决HTML5页面中长按保存图片功能
2019/06/10 HTML / CSS
阿里旅行:飞猪
2017/01/05 全球购物
俄罗斯最大的在线手表商店:Bestwatch.ru
2020/01/11 全球购物
英国领先的鞋类零售商和顶级品牌的官方零售商:Wynsors
2020/02/17 全球购物
shell程序如何生命变量?shell变量是弱变量吗?
2014/11/10 面试题
公司综合部的成员自我评价分享
2013/11/05 职场文书
人事主管的岗位职责
2013/11/16 职场文书
投标单位介绍信
2015/05/05 职场文书
交通安全主题班会
2015/08/12 职场文书
社会心理学学习心得体会
2016/01/22 职场文书
python调试工具Birdseye的使用教程
2021/05/25 Python
Win11无法安装更新补丁KB3045316怎么办 附KB3045316补丁修复教程
2022/08/14 数码科技