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 相关文章推荐
Discuz 5.0 中读取纯真IP数据库函数分析
Mar 16 PHP
php array_slice函数的使用以及参数详解
Aug 30 PHP
超级简单的php+mysql留言本源码
Nov 11 PHP
服务器web工具 php环境下
Dec 29 PHP
PHP匿名函数和use子句用法实例
Mar 16 PHP
php中preg_replace_callback函数简单用法示例
Jul 21 PHP
PHP编写简单的App接口
Aug 28 PHP
php简单实现多维数组排序的方法
Sep 30 PHP
php实现支持中文的文件下载功能示例
Aug 30 PHP
浅谈PHP接入(第三方登录)QQ登录 OAuth2.0 过程中遇到的坑
Oct 13 PHP
使用laravel和ajax实现整个页面无刷新的操作方法
Oct 03 PHP
简单的php购物车代码
Jun 05 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/11/19 PHP
php数组函数array_key_exists()小结
2015/12/10 PHP
php文件上传的两种实现方法
2016/04/04 PHP
php四种定界符详解
2017/02/16 PHP
使用Codeigniter重写insert的方法(推荐)
2017/03/23 PHP
PHP实现图片的等比缩放和Logo水印功能示例
2017/05/04 PHP
PHP asXML()函数讲解
2019/02/03 PHP
Laravel自定义 封装便捷返回Json数据格式的引用方法
2019/09/29 PHP
JS 继承实例分析
2008/11/04 Javascript
js 方法实现返回多个数据的代码
2009/04/30 Javascript
Javascript笔记一 js以及json基础使用说明
2010/05/22 Javascript
javascript中关于break,continue的特殊用法与介绍
2012/05/24 Javascript
jQuery使用动态渲染表单功能完成ajax文件下载
2013/01/15 Javascript
ajax处理php返回json数据的实例代码
2013/01/24 Javascript
jquery的ajax请求全面了解
2013/03/20 Javascript
jQuery实现精美的多级下拉菜单特效
2015/03/14 Javascript
分步解析JavaScript实现tab选项卡自动切换功能
2016/01/25 Javascript
JavaScript随机打乱数组顺序之随机洗牌算法
2016/08/02 Javascript
微信小程序商城项目之侧栏分类效果(1)
2017/04/17 Javascript
JavaScript内置对象之Array的使用小结
2020/05/12 Javascript
vue中配置scss全局变量的步骤
2020/12/28 Vue.js
Python中AND、OR的一个使用小技巧
2015/02/18 Python
Python实现分割文件及合并文件的方法
2015/07/10 Python
python使用xslt提取网页数据的方法
2018/02/23 Python
django+tornado实现实时查看远程日志的方法
2019/08/12 Python
用sqlalchemy构建Django连接池的实例
2019/08/29 Python
基于Python解密仿射密码
2019/10/21 Python
ajax是什么及其工作原理
2012/02/08 面试题
与UNIX有关的几个名词
2015/09/17 面试题
毕业生求职简历的自我评价
2013/10/23 职场文书
个人简历自荐信
2014/06/26 职场文书
汽车机电维修工求职信
2014/09/30 职场文书
工作失误检讨书
2015/01/26 职场文书
公司股份转让协议书范本
2015/01/28 职场文书
夫妻吵架保证书
2015/05/08 职场文书
地道战观后感2000字
2015/06/04 职场文书