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 相关文章推荐
PHP将DateTime对象转化为友好时间显示的实现代码
Sep 20 PHP
比较简单实用的PHP无限分类源码分享(思路不错)
Oct 13 PHP
php获取文件内容最后一行示例
Jan 09 PHP
浅析Yii2中GridView常见操作
Apr 22 PHP
thinkphp3.x连接mysql数据库的方法(具体操作步骤)
May 19 PHP
PHP多进程编程总结(推荐)
Jul 18 PHP
Zend Framework实现自定义过滤器的方法
Dec 09 PHP
总结的一些PHP开发中的tips(必看篇)
Mar 24 PHP
laravel 5.3中自定义加密服务的方案详解
May 09 PHP
PHP截取发动短信内容的方法
Jul 04 PHP
Yii框架ACF(accessController)简单权限控制操作示例
Apr 26 PHP
Laravel中validation验证 返回中文提示 全局设置的方法
Sep 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
一个显示某段时间内每个月的方法 返回由这些月份组成的数组
2012/05/16 PHP
php数组去重的函数代码
2013/02/03 PHP
深入理解PHP中mt_rand()随机数的安全
2017/10/12 PHP
laravel 5.3 单用户登录简单实现方法
2019/10/14 PHP
PHPExcel实现的读取多工作表操作示例
2020/04/14 PHP
IE6中使用position导致页面变形的解决方案(js代码)
2011/01/09 Javascript
异步javascript的原理和实现技巧介绍
2012/11/08 Javascript
js innerHTML 改变div内容的方法
2013/08/03 Javascript
简述JavaScript的正则表达式中test()方法的使用
2015/06/16 Javascript
javascript中数组方法汇总
2015/07/07 Javascript
JS表单验证的代码(常用)
2016/04/08 Javascript
js实现右键自定义菜单
2016/12/03 Javascript
JavaScript设计模式之策略模式详解
2017/06/09 Javascript
详解vue-cli 快速搭建单页应用之遇到的问题及解决办法
2018/03/01 Javascript
angular-tree-component的使用详解
2018/07/30 Javascript
vue以组件或者插件的形式实现throttle或者debounce
2019/05/22 Javascript
Vue中跨域及打包部署到nginx跨域设置方法
2019/08/26 Javascript
使用xampp将angular项目运行在web服务器的教程
2019/09/16 Javascript
JavaScript之scrollTop、scrollHeight、offsetTop、offsetHeight等属性学习笔记
2020/07/15 Javascript
Python lambda和Python def区别分析
2014/11/30 Python
详解Python中的array数组模块相关使用
2016/07/05 Python
python修改list中所有元素类型的三种方法
2018/04/09 Python
用pycharm开发django项目示例代码
2018/10/24 Python
浅谈python的深浅拷贝以及fromkeys的用法
2019/03/08 Python
PyTorch的自适应池化Adaptive Pooling实例
2020/01/03 Python
Python re正则表达式元字符分组()用法分享
2020/02/10 Python
Selenium自动化测试工具使用方法汇总
2020/06/12 Python
css3 给页面加个半圆形导航条主要利用旋转和倾斜样式
2014/02/10 HTML / CSS
HTML5进度条特效
2014/12/18 HTML / CSS
Burt’s Bees英国官网:世界领先的天然个人护理品牌
2020/08/17 全球购物
机械专业求职信
2014/05/25 职场文书
历史学专业求职信
2014/06/19 职场文书
感恩老师主题班会
2015/08/12 职场文书
安全教育主题班会总结
2015/08/14 职场文书
漫画「请问您今天要来点兔子吗?」最新杂志彩页公开
2022/03/24 日漫
Python进程间的通信之语法学习
2022/04/11 Python