php 汉字正则表达式实例详解

 更新时间:2016年11月25日 15:44  点击:1623
在php中汉字正则可能有些朋友觉得很简单,但是在使用时会发现在gbk编码与uft8编码可能会有点区别哦,下面小编来介绍一下。


gbk编码下汉字正则


1.判断字符串是否全是汉字

 代码如下 复制代码
<?php
    $str = '全部是汉字测试';
    if (preg_match_all("/^([x81-xfe][x40-xfe])+$/", $str, $match)) {
        echo '全部是汉字'; 
    } else {
        echo '不全是汉字';
    }
?>

当$str = '全部是汉字测试'; 时输出"全部是汉字";
当$str = 'all全部是汉字测试'; 时输出"不全是汉字";

2.判断字符串是否包含汉字

 代码如下 复制代码
<?php
    $str = '汉字3测试';
    if (preg_match("/([x81-xfe][x40-xfe])/", $str, $match)) {
        echo '含有汉字'; 
    } else {
        echo '不含有汉字';
    }
?>

当$str = '汉字3测试'; 时输出"含有汉字";
当$str = 'abc345'; 时输出"不含有汉字";

上述变量$str的内容与utf8还是gbk编码无关,判断结果是一样的。

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

 

 代码如下 复制代码
$str = "php编程";
if (preg_match("/^[x{4e00}-x{9fa5}]+$/u",$str)) {
print("该字符串全部是中文");
} else {
print("该字符串不全部是中文");
}
有不少php初学者截取字符都会使用substr()函数或者mb_substr()函数来截取了,第一个中文肯定乱码了,第二个性能不好,下面我总结了几个自定的中文字串截取无乱码实例。


例1

 代码如下 复制代码

function msubstr($str, $start=0, $length, $charset="utf-8", $suffix=true)
    {
        if(function_exists("mb_substr"))
            return mb_substr($str, $start, $length, $charset);
        elseif(function_exists('iconv_substr')) {
            return iconv_substr($str,$start,$length,$charset);
        }
        $re['utf-8']   = "/[x01-x7f]|[xc2-xdf][x80-xbf]|[xe0-xef][x80-xbf]{2}|[xf0-xff][x80-xbf]{3}/";
        $re['gb2312'] = "/[x01-x7f]|[xb0-xf7][xa0-xfe]/";
        $re['gbk']    = "/[x01-x7f]|[x81-xfe][x40-xfe]/";
        $re['big5']   = "/[x01-x7f]|[x81-xfe]([x40-x7e]|xa1-xfe])/";
        preg_match_all($re[$charset], $str, $match);
        $slice = join("",array_slice($match[0], $start, $length));
        if($suffix) return $slice."…";
        return $slice;
    }

例2

 代码如下 复制代码

<?php
//$start:指定开始截取字符串的位置;$length指定截取字符的长度
function substr2($string, $start, $length)
{
$len = strlen($string);
if($len > $length)
{
   $str = '';
   $len1 = $start + $length; //截取到原字符串的位置
   for($i=$start; $i<$len1; $i++)
   {
    if(ord(substr($string, $i, 2)) > 0xa0) //在ASCII中,0xa0表示汉字的开始
    {
     $str.=substr($string, $i, 2);
     $i++;
    }
    else
    {
     $str.=substr($string, $i, 1);
    }
   }
   return $str.'...';
}
else
{
   return $string;
}
}

?>

再补充个简单的,思路相同(2010-5-31)

 代码如下 复制代码

<?php
function chinesesubstr($str, $start, $len){
   $strlen = $start + $len;
   for($i=0; $i<$strlen; $i++){
    if(ord(substr($str, $i, 1)) > 0xa0){
     $tmpstr .= substr($str, $i, 2);
     $i++;
    }else{
     $tmpstr .= substr($str, $i, 1);
    }
   }
   return $tmpstr;
}
$str = "waiting for you 等wait你back";
echo chinesesubstr($str, 0, 19)
?>

php ZipArchive可以说是php自带的一个函数了,他可对对文件进行压缩与解压缩处理,但是使用此类之前我们必须在php.ini中把extension=php_zip.dll前面的分号有没有去掉,然后再重启Apache这样才能使用这个类库。

ziparchive 可选参数

1.ZipArchive::addEmptyDir

添加一个新的文件目录

2.ZipArchive::addFile

将文件添加到指定zip压缩包中。

3.ZipArchive::addFromString

添加的文件同时将内容添加进去

4.ZipArchive::close

关闭ziparchive

5.ZipArchive::extractTo

将压缩包解压

6.ZipArchive::open

打开一个zip压缩包

7.ZipArchive::getStatusString

返回压缩时的状态内容,包括错误信息,压缩信息等等

8.ZipArchive::deleteIndex

删除压缩包中的某一个文件,如:deleteIndex(0)删除第一个文件

9.ZipArchive::deleteName

删除压缩包中的某一个文件名称,同时也将文件删除。
......
*/


实例

一、解压缩zip文件

 代码如下 复制代码
$zip = new ZipArchive;//新建一个ZipArchive的对象
/*
通过ZipArchive的对象处理zip文件
$zip->open这个方法的参数表示处理的zip文件名。
如果对zip文件对象操作成功,$zip->open这个方法会返回TRUE
*/
if ($zip->open('test.zip') === TRUE)
{
$zip->extractTo('images');//假设解压缩到在当前路径下images文件夹的子文件夹php
$zip->close();//关闭处理的zip文件
}

二、将文件压缩成zip文件

 代码如下 复制代码
$zip = new ZipArchive;
/*
$zip->open这个方法第一个参数表示处理的zip文件名。
第二个参数表示处理模式,ZipArchive::OVERWRITE表示如果zip文件存在,就覆盖掉原来的zip文件。
如果参数使用ZIPARCHIVE::CREATE,系统就会往原来的zip文件里添加内容。
如果不是为了多次添加内容到zip文件,建议使用ZipArchive::OVERWRITE。
使用这两个参数,如果zip文件不存在,系统都会自动新建。
如果对zip文件对象操作成功,$zip->open这个方法会返回TRUE
*/
if ($zip->open('test.zip', ZipArchive::OVERWRITE) === TRUE)
{
$zip->addFile('image.txt');//假设加入的文件名是image.txt,在当前路径下
$zip->close();
}

三、文件追加内容添加到zip文件

 代码如下 复制代码
$zip = new ZipArchive;
$res = $zip->open('test.zip', ZipArchive::CREATE);
if ($res === TRUE) {
$zip->addFromString('test.txt', 'file content goes here');
$zip->close();
echo 'ok';
} else {
echo 'failed';
}

四、将文件夹打包成zip文件

 代码如下 复制代码

function addFileToZip($path, $zip) {
$handler = opendir($path); //打开当前文件夹由$path指定。
/*
循环的读取文件夹下的所有文件和文件夹
其中$filename = readdir($handler)是每次循环的时候将读取的文件名赋值给$filename,
为了不陷于死循环,所以还要让$filename !== false。
一定要用!==,因为如果某个文件名如果叫'0',或者某些被系统认为是代表false,用!=就会停止循环
*/
while (($filename = readdir($handler)) !== false) {
if ($filename != "." &amp;&amp; $filename != "..") {//文件夹文件名字为'.'和‘..’,不要对他们进行操作
if (is_dir($path . "/" . $filename)) {// 如果读取的某个对象是文件夹,则递归
addFileToZip($path . "/" . $filename, $zip);
} else { //将文件加入zip对象
$zip->addFile($path . "/" . $filename);
}
}
}
@closedir($path);
}

$zip = new ZipArchive();
if ($zip->open('images.zip', ZipArchive::OVERWRITE) === TRUE) {
addFileToZip('images/', $zip); //调用方法,对要打包的根目录进行操作,并将ZipArchive的对象传递给方法
$zip->close(); //关闭处理的zip文件
}


如果只知道文件名,而不知到文件的具体路径,可以搜索指定文件名的索引,再依靠索引获取内容。

 代码如下 复制代码


<?php
$zip = new ZipArchive;
if ($zip->open('test.zip') === TRUE) {
  $index=$zip->locateName('example.php', ZIPARCHIVE::FL_NOCASE|ZIPARCHIVE::FL_NODIR);
  $contents = $zip->getFromIndex($index);
}
?>

 
上面获取索引依靠 locateName方法,如果压缩包内多个路径下有同名文件,好像只能返回第一个的索引,如果要获取所有同名文件的索引,只能使用笨办法,循环搜索。

 代码如下 复制代码

<?php
$zip = new ZipArchive;
if ($zip->open('test.zip') === TRUE) {
 for($i = 0; $i < $zip->numFiles; $i++)
   {
     if(substr_count($zip->getNameIndex($i), 'example.php')>0){
       $contents = $zip->getFromIndex($i);            
      }
   }
}
?>

下面小编来给大家演示几个php操作zip文件的实例,我们可以读取zip包中指定文件与删除zip包中指定文件,下面来给大这介绍一下。

从zip压缩文件中提取文件

 代码如下 复制代码

<?php
/*
php 从zip压缩文件中提取文件
*/
$zip = new ZipArchive;
 
if ($zip->open('jQuery五屏上下滚动焦点图代码.zip') === TRUE) {//中文文件名要使用ANSI编码的文件格式
    $zip->extractTo('foldername');//提取全部文件
    //$zip->extractTo('/my/destination/dir/', array('pear_item.gif', 'testfromfile.php'));//提取部分文件
    $zip->close();
    echo 'ok';
} else {
    echo 'failed';
}
?>

从一个zip压缩文件中删除文件

 代码如下 复制代码

<?php
/*
php 从一个zip压缩文件中删除文件
*/
$zip = new ZipArchive;
if ($zip->open('ajaxupload.zip') === TRUE) {
    $zip->deleteName('file.txt');//删除文件
    $zip->deleteName('testDir/');//删除文件夹
    $zip->close();
    echo 'ok';
} else {
    echo 'failed';
}
?>

添加一个文件到zip压缩文件中

 代码如下 复制代码

<?php
/*
php 添加一个文件到zip压缩文件中
*/
$zip = new ZipArchive;
 
if ($zip->open('ajaxupload.zip') === TRUE) {//ajaxupload.zip 是已经存在的zip文件,注意中文文件名要注意编码问题
    $zip->addFile('33.xml');//添加新的文件
    $zip->close();
    echo 'ok';
} else {
    echo 'failed';
}
?>

在做PHP程序时,经常会遇到设计多级菜单的编程,比如我们常见的三级菜单,首先展示产品的第一级分类,然后展示二级分类,最后再展示产品,这样就构成了三级结构,如果在后台没有一个很好的分类菜单支持,那么去更改数据时是很麻烦的。


最近在做一个内容管理的项目,客户硬要来一个多级分类,其实在许多的开源后台都是无限级的分类,比如111cn.net的后台,而这些分类的数据仅仅只保存到了一个数据表里,只是用源代码进行了关联而已。

而这些关联的数据并不复杂,其实一个优秀的后台设计,应该是无限的分类,这样,在进行二次开发时,不用再单独进行编程了,只要是功能一样,后台添加一个分类就可以了,这样就达到了功能共享了。

一个更简单的无限级分类菜单代码,我就把上面的原理简单实现一下,这个程序的关键就在于数据表的设计很有特色,不用递归,依靠个简单SQL语句就能列出菜单,看看这个数据表怎么设计的:

数据库字段大概如下:
———————————————————————————–
id 编号

fid 父分类编号

name 分类名

path 分类路径,以 id 为节点,组成类似 ,1,2,3,4, 这样的字符串
———————————————————————————-

可以假设有如下的数据

id fid name path
—————————————————-
1 0 分类1 ,1,

2 0 分类2 ,2,

3 1 分类1-1 ,1,3,

4 1 分类1-2 ,1,4,

5 2 分类2-1 ,2,5,

6 4 分类1-2-1 ,1,4,6,
—————————————————-
实现的PHP全部代码用类封装的,不是必要,而是自己也想熟悉一下OO,呵呵!,来看看页面代码:

 代码如下 复制代码

<?php
/**************************************
页面:menu.php
作者:www.111cn.net
功能:定义数据库操作及生成菜单列表类

**************************************/
class menu{
//创建构造函数,作用:数据库连接并选择相应数据库
public function __construct(){
$dbhost = "localhost";
$dbuser = "root";
$dbpassword = "7529639";
$dbname = "menu";
mysql_connect($dbhost,$dbuser,$dbpassword) or die("error!");
mysql_query("SET NAMES 'GBK'");
mysql_select_db($dbname);
}

//执行SQL语句函数
private function query($sql){
return mysql_query($sql);
}

//取得111cn.net结果集数组函数
private function loop_query($result){
return mysql_fetch_array($result);
}
//列出菜单列表函数
public function menulist(){
$sql="select * from list order by path";
$result=$this->query($sql);
while($rows=$this->loop_query($result)){
if(substr_count($rows['path'],',')>2){
for($i=0;$i<(substr_count($rows['path'],',')-2);$i++)
echo ' ';
}
echo $rows['name'].'<br>';
}
}

//创建析构函数,作用:关闭数据库连接
public function __destruct(){
return mysql_close();
}
}
$db=new menu();//生成实例
$db->menulist();//调用方法生成菜单
?>

小提示:这样就生成了一个无限级的分类菜单,当然,不仅仅只是应用在菜单上,而且可以应用在产品的分类以及地市区的分类上面,后台的增删改查需要自己小小的去写一下

原文来自:04ie.com

[!--infotagslink--]

相关文章

  • PHP正则表达式取双引号内的内容

    取双引号内的内容我们如果一个字符串中只有一个可以使用explode来获得,但如果有多个需要使用正则表达式来提取了,具体的例子如下。 写程序的时候总结一点经验,如何只...2016-11-25
  • 一个关于JS正则匹配的踩坑记录

    这篇文章主要给大家介绍了一个关于JS正则匹配的踩坑记录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-04-13
  • PHP正则表达式之捕获组与非捕获组

    今天遇到一个正则匹配的问题,忽然翻到有捕获组的概念,手册上也是一略而过,百度时无意翻到C#和Java中有对正则捕获组的特殊用法,搜索关键词有PHP时竟然没有相关内容,自己试了一下,发现在PHP中也是可行的,于是总结一下,分享的同...2015-11-08
  • php 验证只能输入汉字、英语、数字的正则表达式

    正则表达式是一门非常有用的并且进行模糊判断的一个功能了,我们下面来看通过正则来验证输入汉字、英语、数字,具体如下。 收藏了正则表达式。可以验证只能输入数...2016-11-25
  • java正则表达式判断前端参数修改表中另一个字段的值

    这篇文章主要介绍了java正则表达式判断前端参数修改表中另一个字段的值,需要的朋友可以参考下...2021-05-07
  • 常用的日期时间正则表达式

    常用的日期时间正则表达式 下面收藏了大量的日期时间正则匹配函数,包括分钟,时间与秒都能达到。 正则表达式 (?n:^(?=d)((?<day>31(?!(.0?[2469]|11))|30(?!.0?2)|29(...2016-11-25
  • PHP正则表达式匹配验证提取网址URL实例总结

    网址规则是可寻的,所以我们可以使用正则表达式来提取字符串中的url地址了,下面一起来看看小编整理的几个PHP正则表达式匹配验证提取网址URL实例. 匹配网址 URL 的...2016-11-25
  • 正则表达式中两个反斜杠的匹配规则详解

    这篇文章主要介绍了正则表达式中两个反斜杠的匹配规则,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-05-07
  • JS中使用正则表达式g模式和非g模式的区别

    这篇文章给大家详细介绍了JS中使用正则表达式g模式和非g模式的区别,非常不错,具有参考借鉴价值,需要的朋友参考下吧...2017-04-03
  • JavaScript利用正则表达式替换字符串中的内容

    本文主要介绍了JavaScript利用正则表达式替换字符串中内容的具体实现方法,并做了简要注释,便于理解。具有一定的参考价值,需要的朋友可以看下...2017-01-09
  • C#正则表达式使用方法示例

    这篇文章主要介绍了C#正则表达式使用方法,大家参考使用...2020-06-25
  • 常用C#正则表达式汇总介绍

    c#正则表达式,用于字符串处理、表单验证等场合,实用高效。现将一些常用的表达式收集于此,以备不时之需。...2020-06-25
  • 一文秒懂python正则表达式常用函数

    这篇文章主要介绍了python正则表达式常用函数及使用方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-05-07
  • Idea使用正则表达式批量替换字符串的方法

    这篇文章给大家介绍了Idea使用正则表达式批量替换字符串的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧...2021-07-21
  • js正则学习小记之匹配字符串字面量

    关于匹配字符串问题,有很多种类型,今天讨论 js 代码里的字符串匹配,因为我想学完之后写个语法高亮练手,所以用js代码当作例子...2021-05-07
  • PHP正则表达式之捕获组与非捕获组

    今天遇到一个正则匹配的问题,忽然翻到有捕获组的概念,手册上也是一略而过,百度时无意翻到C#和Java中有对正则捕获组的特殊用法,搜索关键词有PHP时竟然没有相关内容,自己试了一下,发现在PHP中也是可行的,于是总结一下,分享的同...2015-11-08
  • C# 中使用正则表达式匹配字符的含义

    正则表达式的作用用来描述字符串的特征。本文重点给大家介绍C# 中使用正则表达式匹配字符的含义,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧...2020-06-25
  • Python验证的50个常见正则表达式

    这篇文章主要给大家介绍了关于利用Python验证的50个常见正则表达式的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-11
  • C#编程自学之运算符和表达式

    这篇文章主要介绍了C#运算符和表达式,这是自学C#编程的第五篇,希望对大家的学习有所帮助。...2020-06-25
  • PHP正则表达式过滤html标签属性(DEMO)

    这篇文章主要介绍了PHP正则表达式过滤html标签属性的相关内容,实用性非常,感兴趣的朋友参考下吧...2016-05-06