`
onedada
  • 浏览: 100783 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

php判断是否为中文正则表达式大全(转)

    博客分类:
  • php
 
阅读更多

转载自   http://www.cnblogs.com/DavidYan/articles/2032115.html

 

 

php判断是否为中文正则表达式大全

 

<?php

$str="aaa";
if(!eregi("[^\x80-\xff]","$str"))
{
echo "是";
}
else
{
echo "不是";
}
?>


<?
$str = "中国";
echo $str;
echo "<hr>";

//if (preg_match("/^[".chr(0xa1)."-".chr(0xff)."]+$/", $str)) { //只能在GB2312情况下使用
if (preg_match("/^[\x7f-\xff]+$/", $str)) { //兼容gb2312,utf-8
echo "正确输入";
} else {
echo "错误输入";
}
?>


如果想判断一个字符串内是否有含有中文,请用下面的代码:

if (preg_match("/[\x7f-\xff]/", $string)) {
echo "有中文";
}else{
echo "没有中文";
}

判断中文和编码有关 gbk是双字节,utf8是三字节,可以根据中文的范围来判断   

 

编码范围1. GBK (GB2312/GB18030)   
\x00-\xff GBK双字节编码范围   
\x20-\x7f ASCII   
\xa1-\xff 中文   
\x80-\xff 中文  
  
2. UTF-8 (Unicode)   
\u4e00-\u9fa5 (中文)   
\x3130-\x318F (韩文   
\xAC00-\xD7A3 (韩文)   
\u0800-\u4e00 (日文)   
ps: 韩文是大于[\u9fa5]的字符   
正则例子:   
preg_replace(”/([\x80-\xff])/”,”",$str);  
preg_replace(”/([u4e00-u9fa5])/”,”",$str);   

 

 

  1. //判断内容里有没有中文-GBK (PHP)        
  2. function  check_is_chinese( $s ){        
  3.       return  preg_match( '/[\x80-\xff]./' $s );        
  4. }        
  5.       
  6. //获取字符串长度-GBK (PHP)        
  7. function  gb_strlen( $str ){        
  8.       $count  = 0;        
  9.       for ( $i =0;  $i < strlen ( $str );  $i ++){        
  10.           $s  =  substr ( $str $i , 1);        
  11.           if  (preg_match( "/[\x80-\xff]/" $s )) ++ $i ;        
  12.            ++ $count ;        
  13.      }        
  14.       return   $count ;        
  15. }        
  16.       
  17. //截取字符串字串-GBK (PHP)        
  18. function  gb_substr( $str $len ){        
  19.       $count  = 0;        
  20.       for ( $i =0;  $i < strlen ( $str );  $i ++){        
  21.           if ( $count  ==  $len break ;        
  22.           if (preg_match( "/[\x80-\xff]/" substr ( $str $i , 1))) ++ $i ;        
  23.            ++ $count ;                
  24.      }        
  25.       return   substr ( $str , 0,  $i );        
  26. }        
  27.       
  28. //统计字符串长度-UTF8 (PHP)        
  29. function  utf8_strlen( $str ) {        
  30.       $count  = 0;        
  31.       for ( $i  = 0;  $i  <  strlen ( $str );  $i ++){        
  32.           $value  = ord( $str [ $i ]);        
  33.           if ( $value  > 127) {        
  34.               $count ++;        
  35.               if ( $value  >= 192 &&  $value  <= 223)  $i ++;        
  36.               elseif ( $value  >= 224 &&  $value  <= 239)  $i  =  $i  + 2;        
  37.               elseif ( $value  >= 240 &&  $value  <= 247)  $i  =  $i  + 3;        
  38.               else   die ( 'Not a UTF-8 compatible string' );        
  39.          }        
  40.           $count ++;        
  41.      }        
  42.       return   $count ;        
  43. }        
  44.       
  45.       
  46. //截取字符串-UTF8(PHP)        
  47. function  utf8_substr( $str , $position , $length ){        
  48.       $start_position  =  strlen ( $str );        
  49.       $start_byte  = 0;        
  50.       $end_position  =  strlen ( $str );        
  51.       $count  = 0;        
  52.       for ( $i  = 0;  $i  <  strlen ( $str );  $i ++){        
  53.           if ( $count  >=  $position  &&  $start_position  >  $i ){        
  54.               $start_position  =  $i ;        
  55.               $start_byte  =  $count ;        
  56.          }        
  57.           if (( $count - $start_byte )>= $length ) {        
  58.               $end_position  =  $i ;        
  59.               break ;        
  60.          }            
  61.           $value  = ord( $str [ $i ]);        
  62.           if ( $value  > 127){        
  63.               $count ++;        
  64.               if ( $value  >= 192 &&  $value  <= 223)  $i ++;        
  65.               elseif ( $value  >= 224 &&  $value  <= 239)  $i  =  $i  + 2;        
  66.               elseif ( $value  >= 240 &&  $value  <= 247)  $i  =  $i  + 3;        
  67.               else   die ( 'Not a UTF-8 compatible string' );        
  68.          }        
  69.           $count ++;        
  70.       
  71.      }        
  72.       return ( substr ( $str , $start_position , $end_position - $start_position ));        
  73. }        
  74.       
  75. //判断是否是有韩文-UTF-8 (JavaScript)        
  76. function  checkKoreaChar(str) {        
  77.       for (i=0; i<str.length; i++) {        
  78.           if (((str.charCodeAt(i) > 0x3130 && str.charCodeAt(i) < 0x318F) || (str.charCodeAt(i) >= 0xAC00 && str.charCodeAt(i) <= 0xD7A3))) {        
  79.               return  true;        
  80.          }        
  81.      }        
  82.       return  false;        
  83. }        
  84.       
  85. //判断是否有中文字符-GBK (JavaScript)        
  86. function  check_chinese_char(s){        
  87.       return  (s.length != s.replace(/[^\x00-\xff]/g, "**" ).length);        
  88. }   

 

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

$str="aaa";
if(!eregi("[^\x80-\xff]","$str"))
{
echo "是";
}
else
{
echo "不是";
}
?>


<?
$str = "中国";
echo $str;
echo "<hr>";

//if (preg_match("/^[".chr(0xa1)."-".chr(0xff)."]+$/", $str)) { //只能在GB2312情况下使用
if (preg_match("/^[\x7f-\xff]+$/", $str)) { //兼容gb2312,utf-8
echo "正确输入";
} else {
echo "错误输入";
}
?>


如果想判断一个字符串内是否有含有中文,请用下面的代码:

if (preg_match("/[\x7f-\xff]/", $string)) {
echo "有中文";
}else{
echo "没有中文";
}

 

 

 

 

 

分享到:
评论

相关推荐

    正则表达式经典实例

    对于如何使用正则表达式来解决性能不佳、误报、漏报等常见的错误以及完成一些常见的任务,《正则表达式经典实例》给出了涉及基于C#、Java、JavaScript、Perl、PHP、Python、Ruby和VB.NET等编程语言的解决方案。...

    PHP 通用正则验证 汉字转拼音

    PHP通用正则验证,汉字转拼音,获取IP

    php用正则表达式匹配中文实例详解

    在php中汉字正则可能有些朋友觉得很简单,但是在使用时会发现在gbk编码与uft8编码可能会有点区别哦,下面小编来介绍一下。gbk编码下汉字正则1.判断字符串是否全是汉字复制代码 代码如下:&lt;?php $str = ‘全部是...

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

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

    PHP把空格、换行符、中文逗号等替换成英文逗号的正则表达式

    这个就是只是判断英文状态下的逗号,要是有人不小心输入了中文状态下的逗号怎么办?小数点怎么办?于是我就用正则写了一个表达式,把带有空格换行符之类的替换成逗号。 把提交的id带有空格换行符之类的替换成逗号,...

    PHP开发实战1200例源码

    实例110 通过正则表达式对字符串进行匹配查找 141 实例111 通过IP地址查找主机所在地 142 实例112 解决用substr()函数对中文字符串截取时出现乱码的问题 143 实例113 字符串与HTML标记相互转换 144 实例114 运用...

    php网络开发完全手册

    7.5 正则表达式与字符操作的综合应用 110 7.5.1 获得与模式匹配的数组单元—— 7.5.1 preg_grep 110 7.5.2 进行全局正则表达式的匹配—— 7.5.2 preg_match_all 111 7.5.3 进行正则表达式的匹配——preg_ 7.5.3 ...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    注:本系列图书的第I、II卷再版时均相应改名为《xxx开发实例大全》(基础卷)及(提高卷),但内容基本无变化,需要的童鞋可自由匹配查找。 内容简介  《PHP开发实战1200例》分为I、II两卷共计1200个例子,包括了开发...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    注:本系列图书的第I、II卷再版时均相应改名为《xxx开发实例大全》(基础卷)及(提高卷),但内容基本无变化,需要的童鞋可自由匹配查找。 内容简介  《PHP开发实战1200例》分为I、II两卷共计1200个例子,包括了开发...

    PHP基础教程 是一个比较有价值的PHP新手教程!

    $a xor $b :异或 (当$a或$b为true时为true,两者一样时为false) ! $a :非 比较运算符有: $a == $b :相等 $a != $b :不等 $a $b :小于 $a $b :小于等于 $a &gt; $b :大于 $a &gt;= $b :大于等于 与C一样PHP也有...

    Google Android SDK开发范例大全(第3版) 4/5

    5.1 具有正则表达式的TextView 5.2 ACTION!CALL!拨打电话 5.3 自制发送短信程序 5.4 自制发送E-mail程序 5.5 自制日历手机数据库 5.6 手机振动的节奏 5.7 图文可视化提醒 5.8 状态栏的图标与文字提醒 5.9 搜索手机...

    Google Android SDK开发范例大全(第3版) 3/5

    5.1 具有正则表达式的TextView 5.2 ACTION!CALL!拨打电话 5.3 自制发送短信程序 5.4 自制发送E-mail程序 5.5 自制日历手机数据库 5.6 手机振动的节奏 5.7 图文可视化提醒 5.8 状态栏的图标与文字提醒 5.9 搜索手机...

    Google Android SDK开发范例大全(第3版) 1/5

    5.1 具有正则表达式的TextView 5.2 ACTION!CALL!拨打电话 5.3 自制发送短信程序 5.4 自制发送E-mail程序 5.5 自制日历手机数据库 5.6 手机振动的节奏 5.7 图文可视化提醒 5.8 状态栏的图标与文字提醒 5.9 搜索手机...

    js使用小技巧

    快速转到位置 obj.scrollIntoView(true) 锚 &lt;a name="first"&gt; &lt;a href="#first"&gt;anchors 网页传递参数 location.search(); 可编辑 obj.contenteditable=true 执行菜单命令 obj.execCommand 双字节字符 ...

    JavaScript网页特效范例宝典源码

    实例089 验证输入的字符串是否为汉字 139 实例090 验证身份证号码 140 实例091 验证用户名和密码 142 实例092 验证车牌号码 144 实例093 验证网站地址 145 实例094 验证数量和金额 147 实例095 验证字符串是否以指定...

    超实用的jQuery代码段

    9.13 根据指定正则表达式识别超链接 9.14 验证Email地址的正确性 9.15 动态统计字符个数 9.16 使用jQuery验证用户年龄 9.17 按照首字母进行元素排序 9.18 获取URL地址的Hash参数 9.19 避免多行文本溢出的算法 9.20 ...

    身份证验证HTML源码

    判断身份证的方法比使用正则表达式更加准确详细请看 js中的 checkidcard.js 判断省份证的 js function checkIsChinese(str){ if (str.length || str.length &gt; 15){ return "姓名长度不正确"; } var ret=true...

Global site tag (gtag.js) - Google Analytics