php截取html字符串及自动补全html标签的方法


Posted in PHP onJanuary 15, 2015

本文实例讲述了php截取html字符串及自动补全html标签的方法。分享给大家供大家参考。具体分析如下:

这里总结一下关于利用php截取html字符串自动补全html标签,实际开发中会经常碰到,很多人直接先strip_tags过滤掉html标签,但是就只剩下纯文本了,可读性非常差,下面是一个函数,代码如下:

/** 

 * 截取HTML,并自动补全闭合 

 * @param $html 

 * @param $length 

 * @param $end 

 */ 

function subHtml($html,$length) { 

 $result = ''; 

 $tagStack = array(); 

 $len = 0; 

 

 $contents = preg_split("~(<[^>]+?>)~si",$html, -1,PREG_SPLIT_NO_EMPTY| PREG_SPLIT_DELIM_CAPTURE); 

 foreach($contents as $tag) 

 { 

 if (trim($tag)=="")  continue; 

 if(preg_match("~<([a-z0-9]+)[^/>]*?/>~si",$tag)){ 

 $result .= $tag; 

 }else if(preg_match("~</([a-z0-9]+)[^/>]*?>~si",$tag,$match)){ 

 if($tagStack[count($tagStack)-1] == $match[1]){ 

 array_pop($tagStack); 

 $result .= $tag; 

 } 

 }else if(preg_match("~<([a-z0-9]+)[^/>]*?>~si",$tag,$match)){ 

 array_push($tagStack,$match[1]); 

 $result .= $tag; 

 }else if(preg_match("~<!--.*?-->~si",$tag)){ 

 $result .= $tag; 

 }else{ 

 if($len + mstrlen($tag) < $length){ 

 $result .= $tag; 

 $len += mstrlen($tag);  

 }else { 

 $str = msubstr($tag,0,$length-$len+1); 

 $result .= $str; 

 break; 

 } 

 

 } 

 } 

 while(!emptyempty($tagStack)){ 

 $result .= '</'.array_pop($tagStack).'>'; 

 } 

 return  $result; 

} 

 

/** 

 * 截取中文字符串 

 * @param $string 字符串 

 * @param $start 起始位 

 * @param $length 长度 

 * @param $charset  编码 

 * @param $dot 附加字串 

 */ 

function msubstr($string, $start, $length,$dot='',$charset = 'UTF-8') { 

 $string = str_replace(array('&', '"', '<', '>',' '), array('&', '"', '<', '>',' '), $string); 

 if(strlen($string) <= $length) { 

 return $string; 

 } 

 

 if(strtolower($charset) == 'utf-8') { 

 $n = $tn = $noc = 0; 

 while($n < strlen($string)) { 

 $t = ord($string[$n]); 

 if($t == 9 || $t == 10 || (32 <= $t && $t <= 126)) { 

 $tn = 1; $n++; 

 } elseif(194 <= $t && $t <= 223) { 

 $tn = 2; $n += 2; 

 } elseif(224 <= $t && $t <= 239) { 

 $tn = 3; $n += 3; 

 } elseif(240 <= $t && $t <= 247) { 

 $tn = 4; $n += 4; 

 } elseif(248 <= $t && $t <= 251) { 

 $tn = 5; $n += 5; 

 } elseif($t == 252 || $t == 253) { 

 $tn = 6; $n += 6; 

 } else { 

 $n++; 

 } 

 $noc++; 

 if($noc >= $length) { 

 break; 

 } 

 } 

 if($noc > $length) { 

 $n -= $tn; 

 } 

 $strcut = substr($string, 0, $n); 

 } else { 

 for($i = 0; $i < $length; $i++) { 

 $strcut .= ord($string[$i]) > 127 ? $string[$i].$string[++$i] : $string[$i]; 

 } 

 } 

 

 return $strcut.$dot; 

} 

 

/** 

 * 取得字符串的长度,包括中英文。 

 */ 

function mstrlen($str,$charset = 'UTF-8'){ 

 if (function_exists('mb_substr')) { 

 $length=mb_strlen($str,$charset); 

 } elseif (function_exists('iconv_substr')) { 

 $length=iconv_strlen($str,$charset); 

 } else {

 preg_match_all("/[x01-x7f]|[xc2-xdf][x80-xbf]|xe0[xa0-xbf][x80-xbf]|[xe1-xef][x80-xbf][x80-xbf]|xf0[x90-xbf][x80-xbf][x80-xbf]|[xf1-xf7][x80-xbf][x80-xbf][x80-xbf]/", $text, $ar);   

 $length=count($ar[0]); 

 } 

 return $length; 

}

实例,代码如下:
* @param 要截取的HTML $str 

* @param 截取的数量 $num 

* @param 是否需要加上更多 $more 

* @return 截取串 

*/ 

function phpos_chsubstr_ahtml($str,$num,$more=false) 

{ 

    $leng=strlen($str); 

      if($num>=$leng)

      return $str; 

    $word=0; 

    $i=0;                        /** 字符串指针 **/ 

    $stag=array(array());        /** 存放开始HTML的标志 **/ 

    $etag=array(array());        /** 存放结束HTML的标志 **/ 

    $sp = 0; 

    $ep = 0; 

      while($word!=$num) 

      { 

          if(ord($str[$i])>128) 

          { 

            //$re.=substr($str,$i,3); 

            $i+=3; 

            $word++; 

          } 

          else if ($str[$i]=='<') 

          { 

              if ($str[$i+1] == '!') 

              { 

                $i++; 

                  continue; 

              } 

 

              if ($str[$i+1]=='/')     

              { 

                $ptag=&$etag ; 

                $k=&$ep; 

                $i+=2; 

              } 

              else                     

              { 

                $ptag=&$stag; 

                $i+=1; 

                $k=&$sp; 

              } 

 

              for(;$i<$leng;$i++)         

              { 

                  if ($str[$i] == ' ') 

                  { 

                    $ptag[$k] = implode('',$ptag[$k]); 

                    $k++; 

                      break; 

                  } 

                  if ($str[$i] != '>')  

                  { 

                    $ptag[$k][]=$str[$i]; 

                      continue; 

                  } 

                  else                 

                  { 

                    $ptag[$k] = implode('',$ptag[$k]); 

                    $k++; 

                      break; 

                  } 

              } 

            $i++; 

              continue; 

          } 

          else 

          { 

            //$re.=substr($str,$i,1); 

            $word++; 

            $i++; 

          } 

      } 

      foreach ($etag as $val) 

      { 

        $key1=array_search($val,$stag); 

          if ($key1 !== false)          unset($stag[$key]); 

      } 

      foreach ($stag as $key => $val) 

      { 

          if (in_array($val,array('br','img'))) unset($stag[$key1]); 

      } 

    array_reverse($stag); 

    $ends = '</'.implode('></',$stag).'>'; 

    $re = substr($str,0,$i).$ends; 

      if($more)    $re.='...'; 

      return $re; 

}

PHP截取字符串,生成文章摘要,我们在写BLOG时经常需要显示文章前一部分,但是又怕不恰当截断破坏封闭标签以造成整个文档结构破坏,代码如下:
function text_zhaiyao($text,$length){ //文章摘要生成函数  $test:内容 $length:摘要长度 

    global $Briefing_Length; 

    mb_regex_encoding("UTF-8"); 

    if(mb_strlen($text) <= $length ) return $text; 

    $Foremost = mb_substr($text, 0, $length); 

    $re = "<(/?) 

    (P|DIV|H1|H2|H3|H4|H5|H6|ADDRESS|PRE|TABLE|TR|TD|TH|INPUT|SELECT|TEXTAREA|OBJECT|A|UL|OL|LI| 

    BASE|META|LINK|HR|BR|PARAM|IMG|AREA|INPUT|SPAN)[^>]*(>?)"; 

    $Single = "/BASE|META|LINK|HR|BR|PARAM|IMG|AREA|INPUT|BR/i"; 

      

    $Stack = array(); $posStack = array(); 

      

    mb_ereg_search_init($Foremost, $re, 'i'); 

      

    while($pos = mb_ereg_search_pos()){ 

    $match = mb_ereg_search_getregs(); 

    /* [Child-matching Formulation]: 

      

    $matche[1] : A "/" charactor indicating whether current "<...>" Friction is 

    Closing Part 

    $matche[2] : Element Name. 

    $matche[3] : Right > of a "<...>" Friction 

    */ 

    if($match[1]==""){ 

    $Elem = $match[2]; 

    if(mb_eregi($Single, $Elem) && $match[3] !=""){ 

    continue; 

}

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
PHP网站基础优化方法小结
Sep 29 PHP
phpMyAdmin 安装及问题总结
May 28 PHP
PHP IN_ARRAY 函数使用注意事项
Jul 24 PHP
用来解析.htgroup文件的PHP类
Sep 05 PHP
记录mysql性能查询过程的使用方法
May 02 PHP
探讨PHP删除文件夹的三种方法
Jun 09 PHP
PHP判断远程图片或文件是否存在的实现代码
Feb 20 PHP
PHP信号量基本用法实例详解
Feb 12 PHP
PHP实现接收二进制流转换成图片的方法
Jan 10 PHP
PHP7扩展开发教程之Hello World实现方法示例
Aug 03 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
Mar 24 PHP
php双向队列实例讲解
Nov 17 PHP
php在linux下检测mysql同步状态的方法
Jan 15 #PHP
php中静态类与静态变量用法的区别分析
Jan 15 #PHP
将FCKeditor导入PHP+SMARTY的实现方法
Jan 15 #PHP
php通过Chianz.com获取IP地址与地区的方法
Jan 14 #PHP
php中JSON的使用与转换
Jan 14 #PHP
php rsa加密解密使用详解
Jan 14 #PHP
ThinkPHP 404页面的设置方法
Jan 14 #PHP
You might like
CodeIgniter集成smarty的方法详解
2016/05/26 PHP
基于JQuery的简单实现折叠菜单代码
2010/09/15 Javascript
Javascript 命名空间模式
2013/11/01 Javascript
jquery链式操作的正确使用方法
2014/01/06 Javascript
用javascript对一个json数组深度赋值示例
2014/07/27 Javascript
jquery中ready()函数执行的时机和window的load事件比较
2015/06/22 Javascript
JS+CSS实现的竖向简洁折叠菜单效果代码
2015/10/22 Javascript
JSON遍历方式实例总结
2015/12/07 Javascript
封装获取dom元素的简单实例
2016/07/08 Javascript
原生js实现tab选项卡切换
2020/03/23 Javascript
使用bootstrap-paginator.js 分页来进行ajax 异步分页请求示例
2017/03/09 Javascript
JS组件系列之MVVM组件构建自己的Vue组件
2017/04/28 Javascript
EasyUI在Panel上动态添加LinkButton按钮
2017/08/11 Javascript
Nodejs 和Session 原理及实战技巧小结
2017/08/25 NodeJs
ES6解构赋值实例详解
2017/10/31 Javascript
解决低版本的浏览器不支持es6的import问题
2018/03/09 Javascript
浅谈vue项目可以从哪些方面进行优化
2018/05/05 Javascript
微信小程序url传参写变量的方法
2018/08/09 Javascript
Next.js实现react服务器端渲染的方法示例
2019/01/06 Javascript
小程序测试后台服务的方法(ngrok)
2019/03/08 Javascript
小程序云开发之用户注册登录
2019/05/18 Javascript
[01:22:28]DOTA2-DPC中国联赛 正赛 SAG vs RNG BO3 第一场 1月18日
2021/03/11 DOTA
python实现清屏的方法
2015/04/30 Python
Python 两个列表的差集、并集和交集实现代码
2016/09/21 Python
微信跳一跳python代码实现
2018/01/05 Python
Python设计模式之命令模式简单示例
2018/01/10 Python
用python查找统一局域网下ip对应的mac地址
2021/01/13 Python
小学生红领巾广播稿
2014/01/21 职场文书
上课睡觉检讨书
2014/01/28 职场文书
三关爱志愿服务活动方案
2014/08/17 职场文书
个人贷款授权委托书样本
2014/10/07 职场文书
违规违纪检讨书范文
2015/05/06 职场文书
2015年计算机教学工作总结
2015/07/22 职场文书
关于军训的感想
2015/08/07 职场文书
Python数据分析之pandas读取数据
2021/06/02 Python
深入理解Pytorch微调torchvision模型
2021/11/11 Python