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 相关文章推荐
PHP4 与 MySQL 数据库操作函数详解
Dec 06 PHP
PHP弹出提示框并跳转到新页面即重定向到新页面
Jan 24 PHP
PHP错误Cannot use object of type stdClass as array in错误的解决办法
Jun 12 PHP
thinkphp常见路径用法分析
Dec 02 PHP
PHP中把有符号整型转换为无符号整型方法
May 27 PHP
php中动态变量用法实例
Jun 10 PHP
PHP+MYSQL中文乱码问题
Jul 01 PHP
启用Csrf后POST数据时出现的400错误
Jul 05 PHP
PHP浮点数的一个常见问题
Mar 10 PHP
PHP处理数组和XML之间的互相转换
Jun 02 PHP
PHP实现搜索时记住状态的方法示例
May 11 PHP
Laravel数据库读写分离配置的方法
Oct 13 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
工厂模式在Zend Framework中应用介绍
2012/07/10 PHP
PHP写日志的实现方法
2014/11/05 PHP
php显示页码分页类的封装
2017/06/08 PHP
PHP判断json格式是否正确的实现代码
2017/09/20 PHP
基于PHP实现邮箱验证激活过程详解
2020/10/28 PHP
jquery创建一个新的节点对象(自定义结构/内容)的好方法
2013/01/21 Javascript
如何将一个String和多个String值进行比较思路分析
2013/04/22 Javascript
jQuery实现的导航条切换可显示隐藏
2014/10/22 Javascript
js实现文本框中输入文字页面中div层同步获取文本框内容的方法
2015/03/03 Javascript
AngularJS双向绑定和依赖反转实例详解
2017/04/15 Javascript
AngularJS折叠菜单实现方法示例
2017/05/18 Javascript
Express之托管静态文件的方法
2018/06/01 Javascript
浅谈Javascript常用正则表达式应用
2019/03/08 Javascript
Nodejs中的require函数的具体使用方法
2019/04/02 NodeJs
vue中datepicker的使用教程实例代码详解
2019/07/08 Javascript
Vue事件修饰符native、self示例详解
2019/07/09 Javascript
微信小程序判断用户是否需要再次授权获取个人信息
2019/07/18 Javascript
layui 富文本编辑器和textarea值的相互传递方法
2019/09/18 Javascript
bootstrap实现嵌套模态框的实例代码
2020/01/10 Javascript
详解elementUI中input框无法输入的问题
2020/04/27 Javascript
解决iView Table组件宽度只变大不变小的问题
2020/11/13 Javascript
python 实现文件的递归拷贝实现代码
2012/08/02 Python
python中numpy.zeros(np.zeros)的使用方法
2017/11/07 Python
Python基于matplotlib实现绘制三维图形功能示例
2018/01/18 Python
python多进程使用及线程池的使用方法代码详解
2018/10/24 Python
python安装读取grib库总结(推荐)
2020/06/24 Python
python从ftp获取文件并下载到本地
2020/12/05 Python
django中ImageField的使用详解
2020/12/21 Python
django使用多个数据库的方法实例
2021/03/04 Python
上海中网科技笔试题
2012/02/19 面试题
《三个小伙伴》教学反思
2014/04/11 职场文书
教师思想工作总结2015
2015/05/13 职场文书
长江七号观后感
2015/06/11 职场文书
个人收入证明范本
2015/06/12 职场文书
聊聊redis-dump工具安装问题
2022/01/18 Redis
浅谈MySQL中的六种日志
2022/03/23 MySQL