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 相关文章推荐
一个好用的分页函数
Nov 16 PHP
php实现的遍历文件夹下所有文件,编辑删除
Jan 05 PHP
php去掉字符串的最后一个字符附substr()的用法
Mar 23 PHP
用PHP实现浏览器点击下载TXT文档的方法详解
Jun 02 PHP
解析:通过php socket并借助telnet实现简单的聊天程序
Jun 18 PHP
php二维数组排序详解
Nov 06 PHP
PHP图片库imagemagick安装方法
Sep 23 PHP
PHP写日志的实现方法
Nov 05 PHP
ThinkPHP实现支付宝接口功能实例
Dec 02 PHP
smarty模板引擎使用内建函数foreach循环取出所有数组值的方法
Jan 22 PHP
基于php编程规范(详解)
Aug 17 PHP
PHP从零开始打造自己的MVC框架之类的自动加载实现方法详解
Jun 03 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 中执行系统外部命令
2006/10/09 PHP
跟我学Laravel之安装Laravel
2014/10/15 PHP
php使用curl下载指定大小的文件实例代码
2017/09/30 PHP
JavaScript中出现乱码的处理心得
2009/12/24 Javascript
javaScript checkbox 全选/反选及批量删除
2010/04/28 Javascript
事件冒泡是什么如何用jquery阻止事件冒泡
2013/03/20 Javascript
jquery 日期控件datepicker属性详细解析
2013/11/08 Javascript
Javascript实现返回上一页面并刷新的小例子
2013/12/11 Javascript
jquery的each方法使用示例分享
2014/03/25 Javascript
jquery实现多行文字图片滚动效果示例代码
2014/10/10 Javascript
JS获取各种宽度、高度的简单介绍
2014/12/19 Javascript
jQuery拖拽排序插件制作拖拽排序效果(附源码下载)
2016/02/23 Javascript
深入理解jQuery之防止冒泡事件
2016/05/24 Javascript
Angular ng-class详解及实例代码
2016/09/19 Javascript
JavaScript累加、迭代、穷举、递归等常用算法实例小结
2018/05/08 Javascript
详解es6超好用的语法糖Decorator
2018/08/01 Javascript
详解JS判断页面是在手机端还是在PC端打开的方法
2019/04/26 Javascript
100行代码实现vue表单校验功能(小白自编)
2019/11/19 Javascript
详解JavaScript执行模型
2020/11/16 Javascript
Python爬虫框架Scrapy实战之批量抓取招聘信息
2015/08/07 Python
Python编程实现线性回归和批量梯度下降法代码实例
2018/01/04 Python
python与字符编码问题
2019/05/24 Python
详解如何使用Pytest进行自动化测试
2021/01/14 Python
详解移动端HTML5音频与视频问题及解决方案
2018/08/22 HTML / CSS
Mytheresa英国官网:拥有160多个奢侈品品牌
2016/10/09 全球购物
Boutique 1美国:阿联酋奢侈时尚零售商
2017/10/16 全球购物
瑞典手机壳品牌:Richmond & Finch
2018/04/28 全球购物
幼儿园大班新学期寄语
2014/01/18 职场文书
大学班级干部的自我评价分享
2014/02/10 职场文书
党性锻炼的心得体会
2014/09/03 职场文书
结婚堵门保证书
2015/05/08 职场文书
天鹅湖观后感
2015/06/09 职场文书
2019年度行政文员工作计划范本!
2019/07/04 职场文书
某某幼儿园的教育教学管理调研分析报告
2019/11/29 职场文书
实战 快速定位MySQL的慢SQL
2022/03/22 MySQL
SQL Server删除表中的重复数据
2022/05/25 SQL Server