php 正则匹配中文 utf8编码/^[\x{4e00}-\x{9fa5}A-Za-z0-9_]+$

2015-05-12  来源:本站原创  分类:PHP  人气:518 

在javascript中,要判断字符串是中文是很简单的。比如:
var str = "php编程";
if (/^[\u4e00-\u9fa5]+$/.test(str)) {
alert("该字符串全部是中文");
} else {
alert("该字符串不全部是中文");
}

想当然的,在php中来判断字符串是否为中文,就会沿袭这个思路:
<?php
$str = "php编程";
if (preg_match("/^[\u4e00-\u9fa5]+$/",$str)) {
print("该字符串全部是中文");
} else {
print("该字符串不全部是中文");
}
?>

不过,很快就会发现,php并不支持这样的表达,报错:
Warning: preg_match() [function.preg-match]: Compilation failed: PCRE does not support \L, \l, \N, \U, or \u at offset 3 in test.php on line 3

刚开始从google上查了很多次,想从php正则表达式对于十六进制数据的

表达方式上进行突破,发现在php中,是用\x表示十六进制数据的。于是,

变换成如下的代码:
$str = "php编程";
if (preg_match("/^[\x4e00-\x9fa5]+$/",$str)) {
print("该字符串全部是中文");
} else {
print("该字符串不全部是中文");
}
貌似不报错了,判断的结果也正确,不过把$str换成“编程”两字,结果却

还是显示“该字符串不全部是中文”,看来这样的判断还是不够准确。

后来跑回百度搜“php 匹配汉字 utf 8”,发现文章的匹配程度竟然要比google的高多了,

看来百度的“百度更懂中文”还在一定程度上是正确的。在第二篇文章《★★★ 求UTF8

下匹配汉字的正则, 在线等.........》中看到了如下的一些内容:

楼主zhiin(┈ Jcan ┈)2006-11-15 15:59:30 在 Web 开发 / PHP 提问

求UTF8下匹配汉字的正则, 不包括全角字符及特殊符号!

网上只能找到匹配全角字符的正则: ^[\x80-\xff]*^/
[\u4e00-\u9fa5]可以匹配中文,但是PHP又不支持

郁闷中.......

1 楼PleaseDoTellMeWhy(Allah bless you!)回复于 2006-11-15 16:04:55 得分 11

chr(0xa1) . '-' . chr(0xff)可以匹配所有中文,但是不知道在UTF-8下如何!Top
2 楼zhiin(┈ Jcan ┈)回复于 2006-11-15 16:11:34 得分 0

即使在gb2312下, chr(0xa1) . '-' . chr(0xff) 也不对
它把全角符号也匹配进来了Top
3 楼xuzuning(唠叨)回复于 2006-11-15 16:19:56 得分 90

模式修正符: u

按照这几位提供的线索逐个试了一下,发现还真的如他们所说,可能还跟编码有关系,

因此需要了解一下模式修正符的相关知识——于是继续搜索百度。

在一篇《模式修正符》的文章中了解到:

u (PCRE_UTF8)

此修正符启用了一个 PCRE 中与 Perl 不兼容的额外功能。模式字符串被当成 UTF-8。

本修正符在 Unix 下自 PHP 4.1.0 起可用,在 win32 下自 PHP 4.2.3 起可用。
例子:
preg_match('/[\x{2460}-\x{2468}]/u', $str); 匹配 内码汉字
按照他提供的方式进行测试,代码如下:

$str = "php编程";
if (preg_match("/^[\x{2460}-\x{2468}]+$/u",$str)) {
print("该字符串全部是中文");
} else {
print("该字符串不全部是中文");
}

发现这次依然对是否为中文判断失常。不过,既然\x表示的十六进制数据,

为什么和js里边提供的范围\x4e00-\x9fa5不一样呢?于是我就换成了下边的代码:
$str = "php编程";
if (preg_match("/^[\x4e00-\x9fa5]+$/u",$str)) {
print("该字符串全部是中文");
} else {
print("该字符串不全部是中文");
}
本来以为铁定成功了的事情,没想到,warning又一次产生了:
Warning: preg_match() [function.preg-match]: Compilation failed: invalid UTF-8 string at offset 6 in test.php on line 3
看来又有错误的表达方式了,于是对照了一下那篇文章的表达方式,

给“4e00”和“9fa5”两边分别用"{"和“}”包起来,跑了一遍,发现真的准确了:
$str = "php编程";
if (preg_match("/^[\x{4e00}-\x{9fa5}]+$/u",$str)) {
print("该字符串全部是中文");
} else {
print("该字符串不全部是中文");
}

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

于是我又用这个表达式去百度搜索,发现竟然还真有别人得出过这样正确的结论,只不过通过

常规的方式很难找到而已,而且仅仅搜到有一篇——《用正则删除汉字》,看来互联网上对于

信息的正确性的筛选还是亟待加强的。

ps:对google不死心,也搜索了一下,又发现了一篇文章《php常用类》,

还是在百度空间的,呵呵,有意思!
----------------------------------------------------------------------------------------------------------------------------------
参考以上文章写了如下一段测试代码(复制以下代码保存成.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>

相关文章
  • php 正则匹配中文 utf8编码/^[\x{4e00}-\x{9fa5}A-Za-z0-9_]+$ 2015-05-12

    在javascript中,要判断字符串是中文是很简单的.比如: var str = "php编程"; if (/^[\u4e00-\u9fa5]+$/.test(str)) { alert("该字符串全部是中文"); } else { alert("该字符串不全部是中文"); } 想当然的,在php中来判断字符串是否为中文,就会沿袭这个思路: <?php $str = "php编程"; if (preg_match(&q

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

    UTF-8匹配: 在javascript中,要判断字符串是中文是很简单的,下面有个不错的判断示例,需要的朋友可以参考下 UTF-8匹配: 在javascript中,要判断字符串是中文是很简单的.比如: var str = "php编程"; if (/^[\u4e00-\u9fa5]+$/.test(str)) { alert("该字符串全部是中文"); }else{ alert("该字符串不全部是中文"); } //php中,是用\x表示十六进制

  • PHP 正则判定中文 UTF-8 ;GBK 2013-07-02

    UTF-8匹配:在javascript中,要判定字符串是中文是很简朴的.比如:var str = "php编程";if (/^[\u4e00-\u9fa5]+$/.test(str)) {alert("该字符串全部是中文");} else{alert("该字符串不全部是中文");}php中,是用 ... UTF-8匹配: 在javascript中,要判定字符串是中文是很简朴的.比如: var str = "php编程"; if

  • VIM中使用正则匹配中文 2014-11-06

    众所周知,使用JS的正则对中文进行验证时,可以使用: /[\u4e00-\u9fa5]+/.test('中文') 但是在VIM中再使用这个正则时,则会提示无法找到匹配项 E384: 已查找到文件开头(结尾)仍找不到[\u4e00-\u9fa5]+ 实际上,VIM的在进行搜索时,有一个'magic'设置,当magic设置为不同的情况时(默认的设置是magic),正则表达式的写法是不同的: magic: 除了`^.*$`之外所有的字符都需要加反斜杠 nomagic: 除了`^$`之外所有的字符都需要

  • 正则匹配中文及常用正则表达式 2015-04-13

    正则表达式用于字符串处理.表单验证.日志数据分析等场合,实用高效.现将自己走网上搜索并总结的常用方法收集了一下: 匹配中文字符的正则表达式: [u4e00-u9fa5] 注:匹配中文还真是个头疼的事,有了这个表达式就好办了 匹配双字节字符(包括汉字在内):[^x00-xff] 注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1) 匹配空白行的正则表达式:ns*r 注:可以用来删除空白行 匹配HTML标记的正则表达式:<(S*?)[^>]*>.*?</>|

  • PHP匹配中文正则(转载)! 2015-03-29

    php 正则匹配中文 (2011-09-26 10:10:46) 标签: 杂谈 分类: 专业篇 转载:http://hi.baidu.com/ͽ_d/blog/item/063b77d5432f8f1aa18bb7fd.html 在javascript中,要判断字符串是中文是很简单的.比如: var str = "php编程"; if (/^[\u4e00-\u9fa5]+$/.test(str)) { alert("该字符串全部是中文"); } else { al

  • 解决IE不能主动识别UTF-8编码的问题的方法 2013-10-09

    之前在动态页面静态化的过程中,IE打开页面后不显示内容,但html代码数据已经下载下来了,将其"字符编码"手动改"utf-8"才可以显示,到google搜索一下,找到解决方法了,为了方便自己也方便别人就把解决方法贴出来! google上搜索的解决方法 -------------------------------------------------------------------------------- 在windows操作系统上使用IE作为浏览器时.常常会发

  • php正则表达匹配中文问题分析小结 2013-11-13

    本文章分析了在php中正则表达式对中文的支持问题,一般情况下我们可会能简单利用我上面的正则来验证中文,后面我分析了关于兼容gb2312,utf-8和表达式 ^[\\x7f-\\xff]+$ 可以完全搞定中文不兼容的问题 $str = '中华人民共和国123456789abcdefg'; echo preg_match("/^[u4e00-u9fa5_a-zA-Z0-9]{3,15}$",$strName); 运行一下上面这段代码,看会有什么提示信息? Warning: preg_mat

  • php中utf-8编码下用正则表达式如何匹配汉字 2014-02-20

    知道了php中utf-8编码下用正则表达式匹配汉字的最终正确表达式--/^[\x{4e00}-\x{9fa5}]+$/u 在javascript中,要判断字符串是中文是很简单的.比如: var str = "php编程"; if (/^[\u4e00-\u9fa5]+$/.test(str)) { alert("该字符串全部是中文"); } else { alert("该字符串不全部是中文"); } 想当然的,在php中来判断字符串是否为中文,就

  • 基于preg_match_all采集后数据处理的一点心得笔记(编码转换和正则匹配) 2015-02-01

    这篇文章主要介绍了采集后数据处理的一点心得笔记,编码转换和正则匹配,基于preg_match_all,需要的朋友可以参考下 1.使用curl实现站外采集 具体请参考我上一篇笔记:http://www.jb51.net/article/46432.htm 2.编码转换 首先通过查看源代码找到采集的网站使用的编码,通过mb_convert_encoding函数进行转码: 具体使用方法: //源字符是$str //以下已知原编码为GBK,转换为utf-8 mb_convert_encoding($st

  • utf-8编码引起js输出中文乱码的解决办法 2014-05-05

    utf-8编码引起document.writeln输出中文乱码的解决办法 编码规则是utf-8,如网页头中的: <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 那么js文件中如果有中文输出就会出现乱码,解决此个问题有两个方法: 1.在引用javascript输出的地方加上charset="gb2312" 或 charset="big5

  • PHP与MYSQL中UTF8编码的中文排序实例 2014-05-07

    这篇文章主要介绍了PHP与MYSQL中UTF8编码的中文排序方法,实例讲述了根据拼音进行排序的方法,需要的朋友可以参考下 本文实例讲述了PHP与MYSQL中UTF8编码的中文排序方法,分享给大家供大家参考.具体实现方法如下: 一般来说,中文共有三种排序方式: 1.根据拼音排序: 2.根据笔画排序: 3.根据偏旁排序. 系统的默认排序方式为拼音排序了,这个也是我们常用的,下面介绍的就是按拼音排序了 1. 需要在php数组中用中文排序,但是一般使用utf8格式的文件,直接用asort排序不行.用gb

  • php用正则表达式匹配中文实例详解 2014-09-16

    php中怎么用正则表达式匹配中文,需要注意什么,本文就详解一下这个,还有实例 在php中汉字正则可能有些朋友觉得很简单,但是在使用时会发现在gbk编码与uft8编码可能会有点区别哦,下面小编来介绍一下. gbk编码下汉字正则 1.判断字符串是否全是汉字 <?php $str = '全部是汉字测试'; if (preg_match_all("/^([x81-xfe][x40-xfe])+$/", $str, $match)) { echo '全部是汉字'; } else { ech

  • 关于php正则匹配汉字的方法介绍 2015-03-04

    本篇文章描述了,关于php正则匹配汉字的介绍.需要的朋友参考下 php正则匹配汉字! /^[\x{4e00}-\x{9fa5}]+$/u 以上这个正则表达式就是困扰了很多php程序员的匹配汉字的正则表达式 大家可能会觉得很简单,实际上不同编码,不同程序语言,都有些细微的出入,稍不注意就得不到正确的结果. 下面是utf-8编码的例子: $str = "汉字"; if (preg_match("/^[\x{4e00}-\x{9fa5}]+$/u",$str)) { pr

  • javascript中使用正则计算中文长度的例子 2013-10-04

    这篇文章主要介绍了javascript中使用正则计算中文长度的例子,需要的朋友可以参考下 由于javascript是unicode编码的,所有的字符对于它来说一个就是一个,但是后台程序不是,通常在后台程序中一个中文是占两个字节的,这就导致了前后端校验长度不一致,这个问题可以通过正则来解决. function getRealLen( str ) { return str.replace(/[^\x00-\xff]/g, '__').length; //这个把所有双字节的都给匹配进去了 } 附赠另一

  • gbk和utf8编码自动识别方法[php版] 2013-12-14

    目前中文网页主流的编码为gbk和utf8两种编码.因此,我们做编码识别的前提是,编码不是gbk就是utf8. 编码自动识别的基本思想如下: 1.看给定的字节串是否符合utf8编码规则.如果不符合则为gbk编码. 2.如果给定的字节串中没有符合utf8三字节规则的,则为gbk编码.中文在utf8中占三个字节. 3.如果给定的字节串能对应上gbk编码中的中文,且无法对应上utf8编码中的中文,则为gbk编码. 4.特殊情况,特殊处理.如 "??l" 和 "瑷?Z". 总

  • C#匹配中文字符串的4种正则表达式分享 2015-03-23

    这篇文章主要介绍了C#匹配中文字符串的4种正则表达式分享,本文介绍了4种形式下的中文字符串匹配正则,需要的朋友可以参考下 本文介绍在C#中使用匹配中文的正则表达式,包括纯中文.有中文.中文开头.中文结尾等几个正则表达式示例.在正则表达式中,中文可以通过Unicode编码来确定正则表达式范围. 在C#中,匹配中文的正则表达式用Unicode来表示时,范围是: [\u4e00-\u9fa5].所以,在此基础上,我们可以得到如下一些正则表达式. 1.匹配字符串全部是中文字符的正则表达式 "^[\u4e

  • urlrewriter 地址匹配中文 2013-03-02

    <!-- 景区搜索 --> <rule> <from>^/scenic/searchbycityName_([%a-zA-Z0-9]+).html$</from> <to>/scenicInfo.do?act=searchScenicInfoByName&cityName=$1</to> </rule> function searchByName() { var cityName = $("input[n

  • gbk和utf8编码自动识别方法 2014-12-26

    目前中文网页主流的编码为gbk和utf8两种编码.因此,我们做编码识别的前提是,编码不是gbk就是utf8. 编码自动识别的基本思想如下: 1.看给定的字节串是否符合utf8编码规则.如果不符合则为gbk编码. 2.如果给定的字节串中没有符合utf8三字节规则的,则为gbk编码.中文在utf8中占三个字节. 3.如果给定的字节串能对应上gbk编码中的中文,且无法对应上utf8编码中的中文,则为gbk编码. 4.特殊情况,特殊处理.如 "鏈條" 和 "瑷媄". 总体思

  • 使用python实现正则匹配检索远端FTP目录下的文件 2013-10-16

    这篇文章主要介绍了使用python实现正则匹配检索远端FTP目录下的文件的方法,非常的简单实用,需要的小伙伴参考下 遇到一个问题,需要正则匹配远端FTP目录下的文件,如果使用ftp客户端可以通过命令行很容易的做到这一点,但是暂时没有一个工具支持这样的需求,于是通过python对FTP的支持和对正则表达式的支持,写了这么一个简单的工具,用于使用正则表达式来匹配远端目录的文件. 代码如下 # coding=utf-8 #########################################