PHP 正则判断中文UTF-8或GBK的思路及具体实现


Posted in PHP onNovember 26, 2013

UTF-8匹配: 在javascript中,要判断字符串是中文是很简单的。比如:

var str = "php编程"; 
if (/^[\u4e00-\u9fa5]+$/.test(str)) { 
alert("该字符串全部是中文"); 
}else{ 
alert("该字符串不全部是中文"); 
} 
//php中,是用\x表示十六进制数据的。于是,变换成如下的代码: 
$str = "php编程"; 
if (preg_match("/^[\x4e00-\x9fa5]+$/",$str)) { 
print("该字符串全部是中文"); 
} else { 
print("该字符串不全部是中文"); 
}

貌似不报错了,判断的结果也正确,不过把$str换成“编程”两字,结果却还是显示“该字符串不全部是中文”,看来这样的判断还是不够准确。重要:查阅了<精通正则表达式>发现,对于[\x4e00-\x9fa5]这块东西,自己做一个强化的解释 php的正则中, [\x4e00-\x9fa5],其实就是 字符和字符组的概念, \x{hex},表达一个16进制数, 需要注意的是hex 可以是1-2位的,也可以是4位的,但是如果是4位的必须加上大括号, 同时,如果是大于x{FF}的hex,必须和u 修饰符连用,不然会非法出错
网上只能找到匹配全角字符的正则: ^[\x80-\xff]*^/ ,这里可以不加大括号
[\u4e00-\u9fa5]可以匹配中文,但是PHP又不支持
不过,既然\x表示的十六进制数据,为什么和js里边提供的范围\x4e00-\x9fa5不一样呢?于是我就换成了下边的代码,发现真的准确了:
$str = "php编程"; 
if (preg_match("/^[\x{4e00}-\x{9fa5}]+$/u",$str)) { 
print("该字符串全部是中文"); 
} else { 
print("该字符串不全部是中文"); 
}

知道了php中utf-8编码下用正则表达式匹配汉字的最终正确表达式——/^[\x{4e00}-\x{9fa5}]+$/u,

参考以上文章写了如下一段测试代码(复制以下代码保存成.php文件)

<?php 
$action = trim($_GET['action']); 
if($action == "sub") 
{ 
$str = $_POST['dir']; 
//if(!preg_match("/^[".chr(0xa1)."-".chr(0xff)."A-Za-z0-9_]+$/",$str)) //GB2312汉字字母数字下划线正则表达式 
if(!preg_match("/^[\x{4e00}-\x{9fa5}A-Za-z0-9_]+$/u",$str)) //UTF-8汉字字母数字下划线正则表达式 
{ 
echo "<font color=red>您输入的[".$str."]含有违法字符</font>"; 
} 
else 
{ 
echo "<font color=green>您输入的[".$str."]完全合法,通过!</font>"; 
} 
} 
?>

<form. method="POST" action="?action=sub"> 
输入字符(数字,字母,汉字,下划线): 
<input type="text" name="dir" value=""> 
<input type="submit" value="提交"> 
</form>

GBK: preg_match("/^[".chr(0xa1)."-".chr(0xff)."A-Za-z0-9_]+$/",$str); //GB2312汉字字母数字下划线正则表达式。
PHP 相关文章推荐
NO3第三帝国留言簿制作过程
Oct 09 PHP
请php正则走开
Mar 15 PHP
php 无限级缓存的类的扩展
Mar 16 PHP
百度地图API应用之获取用户的具体位置
Jun 10 PHP
ThinkPHP打开验证码页面显示乱码的解决方法
Dec 18 PHP
学习php开源项目的源码指南
Dec 21 PHP
PHP、Python和Javascript的装饰器模式对比
Feb 03 PHP
php约瑟夫问题解决关于处死犯人的算法
Mar 23 PHP
thinkPHP内置字符串截取函数用法详解
Nov 15 PHP
PHP开发之用微信远程遥控服务器
Jan 25 PHP
微信公众平台开发教程③ PHP实现微信公众号支付功能图文详解
Apr 10 PHP
详解提高使用Java反射的效率方法
Apr 29 PHP
php对二维数组按指定键值key排序示例代码
Nov 26 #PHP
PHP上传文件时文件过大$_FILES为空的解决方法
Nov 26 #PHP
PHP获取当前url的具体方法全面解析
Nov 26 #PHP
php 批量替换html标签的实例代码
Nov 26 #PHP
利用phpExcel实现Excel数据的导入导出(全步骤详细解析)
Nov 26 #PHP
php数组去重实例及分析
Nov 26 #PHP
php三维数组去重(示例代码)
Nov 26 #PHP
You might like
PHP 如何利用phpexcel导入数据库
2013/08/24 PHP
PHP的引用详解
2015/02/22 PHP
php隐藏实际地址的文件下载方法
2015/04/18 PHP
php文件缓存类用法实例分析
2015/04/22 PHP
ThinkPHP 整合Bootstrap Ajax分页样式
2016/12/23 PHP
PHP实现求两个字符串最长公共子串的方法示例
2017/11/17 PHP
Gambit vs ForZe BO3 第二场 2.13
2021/03/10 DOTA
优化innerHTML操作(提高代码执行效率)
2011/08/20 Javascript
ejs v9 javascript模板系统
2012/03/21 Javascript
js中eval详解
2012/03/30 Javascript
js猜数字小游戏的简单实现代码
2013/07/02 Javascript
javascript跑马灯抽奖实例讲解
2020/04/17 Javascript
实现隔行换色效果的两种方式【实用】
2016/11/27 Javascript
Angularjs上传图片实例详解
2017/08/06 Javascript
AngularJS实现的根据数量与单价计算总价功能示例
2017/12/26 Javascript
JS实现为动态创建的元素添加事件操作示例
2018/03/17 Javascript
js拖动滑块和点击水波纹效果实例代码
2018/10/16 Javascript
浅析微信扫码登录原理(小结)
2018/10/29 Javascript
微信小程序判断页面是否从其他页面返回的实例代码
2019/07/03 Javascript
jQuery AJAX应用实例总结
2020/05/19 jQuery
详解vue-router的导航钩子(导航守卫)
2020/11/02 Javascript
Python中的模块导入和读取键盘输入的方法
2015/10/16 Python
Django Admin实现上传图片校验功能
2016/03/06 Python
python使用pygame框架实现推箱子游戏
2018/11/20 Python
Python 读取位于包中的数据文件
2020/08/07 Python
Pycharm-community-2020.2.3 社区版安装教程图文详解
2020/12/08 Python
美国智能家居专家:tink
2019/06/04 全球购物
飞利浦西班牙官方网站:Philips西班牙
2020/02/17 全球购物
What's the difference between an interface and abstract class? (接口与抽象类有什么区别)
2012/10/29 面试题
物业公司采购员岗位职责
2013/12/31 职场文书
解除劳动合同协议书范本
2014/04/14 职场文书
幼儿园大班教师个人工作总结
2015/02/05 职场文书
爱护环境卫生倡议书
2015/04/29 职场文书
2015年小学财务工作总结
2015/07/20 职场文书
SpringCloud的JPA连接PostgreSql的教程
2021/06/26 Java/Android
cypress测试本地web应用
2022/06/01 Javascript