博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php判断是否为中文正则表达式大全
阅读量:4090 次
发布时间:2019-05-25

本文共 4679 字,大约阅读时间需要 15 分钟。

<?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-\xffGBK双字节编码范围   
\x20-\x7fASCII   
\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$i1);       
  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 == $lenbreak      
  22.          if(preg_match("/[\x80-\xff]/"substr($str$i1))) ++$i      
  23.            ++$count              
  24.            
  25.      return substr($str0, $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 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 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 "<fontcolor=red>您输入的[".$str."]含有违法字符</font>";  
    }
    else
    {
       echo "<fontcolor=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 "没有中文";

}

http://blog.sina.com.cn/s/blog_62067a650100izag.html

转载地址:http://cojii.baihongyu.com/

你可能感兴趣的文章
原来我之前一直用的APM固件....现在很多东西明白了。
查看>>
realsense-ros里里程计相关代码
查看>>
似乎写个ROS功能包并不难,你会订阅话题发布话题,加点逻辑处理,就可以写一些基础的ROS功能包了。
查看>>
if __name__ == ‘__main__‘:就是Python里的main函数,脚本从这里开始执行,如果没有main函数则从上到下顺序执行。
查看>>
PX4官方用户和开发手册的首页面是会给你选择英文和中文的
查看>>
《跟工程师学嵌入式开发》这本书最后的终极项目我反而觉得有说头
查看>>
博士的申请考核制
查看>>
MAVLink学习之路05_MAVLink应用编程接口分析(也有讲STM32下的收发函数)
查看>>
找到了中文版的mavlink手册
查看>>
浅谈飞控开发的仿真功能
查看>>
我觉得在室内弄无人机开发装个防撞机架还是很有必要的,TBUS就做得很好。
查看>>
serial也是见到很多次了,似乎它就是一种串行通信协议
查看>>
TBUS的一些信息
查看>>
专业和业余的区别就在于你在基础在基本功打磨练习花的时间
查看>>
通过mavlink实现自主航线的过程笔记
查看>>
Ardupilot飞控Mavlink代码学习
查看>>
这些网站有一些嵌入式面试题合集
查看>>
我觉得刷题是有必要的,不然小心实际被问的时候懵逼,我觉得你需要刷个50份面试题。跟考研数学疯狂刷卷子一样!
查看>>
我觉得嵌入式面试三要素:基础吃透+项目+大量刷题,缺一不可。不刷题是不行的。而且得是大量刷,刷出感觉套路,别人做题都做得是固定题型套路条件反射了,你还在那慢慢理解慢慢推是不行的,也是考研的教训。
查看>>
删除docker容器和镜像的命令
查看>>