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 相关文章推荐
详解:――如何将图片储存在数据库里
Dec 05 PHP
php去除重复字的实现代码
Sep 16 PHP
PHP管理内存函数 memory_get_usage()使用介绍
Sep 23 PHP
PHP过滤★等特殊符号的正则
Jan 27 PHP
CI(CodeIgniter)框架中的增删改查操作
Jun 10 PHP
destoon在360浏览器下出现用户被强行注销的解决方法
Jun 26 PHP
php使用Jpgraph绘制柱形图的方法
Jun 10 PHP
在WordPress的后台中添加顶级菜单和子菜单的函数详解
Jan 11 PHP
学习PHP Cookie处理函数
Aug 09 PHP
Laravel Memcached缓存驱动的配置与应用方法分析
Oct 08 PHP
PHP面向对象程序设计重载(overloading)操作详解
Jun 13 PHP
laravel-admin的图片删除实例
Sep 30 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
分享PHP函数实现数字与文字分页代码
2015/07/28 PHP
CI框架出现mysql数据库连接资源无法释放的解决方法
2016/05/17 PHP
php使用escapeshellarg时中文被过滤的解决方法
2016/07/10 PHP
laravel实现Auth认证,登录、注册后的页面回跳方法
2019/09/30 PHP
List the UTC Time on a Computer
2007/06/11 Javascript
js 面向对象的技术创建高级 Web 应用程序
2010/02/25 Javascript
基于jquery的关于动态创建DOM元素的问题
2010/12/24 Javascript
jquery图片放大镜功能的实例代码
2013/03/26 Javascript
深入浅析AngularJS中的module(模块)
2016/01/04 Javascript
Bootstrap 网站实例之单页营销网站
2016/10/20 Javascript
深入解析js轮播插件核心代码的实现过程
2017/04/14 Javascript
JS按条件 serialize() 对应标签的使用方法
2017/07/24 Javascript
js HTML5 canvas绘制图片的方法
2017/09/08 Javascript
面试题:react和vue的区别分析
2019/04/08 Javascript
koa2 用户注册、登录校验与加盐加密的实现方法
2019/07/22 Javascript
卸载vue2.0并升级vue_cli3.0的实例讲解
2020/02/16 Javascript
Nodejs环境实现socket通信过程解析
2020/07/03 NodeJs
python代码制作configure文件示例
2014/07/28 Python
Python字符串处理实例详解
2017/05/18 Python
Python实现绘制双柱状图并显示数值功能示例
2018/06/23 Python
Python pandas DataFrame操作的实现代码
2019/06/21 Python
Python绘图Matplotlib之坐标轴及刻度总结
2019/06/28 Python
python实现自动化报表功能(Oracle/plsql/Excel/多线程)
2019/12/02 Python
python 解决flask 图片在线浏览或者直接下载的问题
2020/01/09 Python
tensorflow入门:TFRecordDataset变长数据的batch读取详解
2020/01/20 Python
Python3 selenium 实现QQ群接龙自动化功能
2020/04/17 Python
Python实现在线批量美颜功能过程解析
2020/06/10 Python
CSS类名支持中文命名的示例
2014/04/04 HTML / CSS
英国赛车、汽车改装和摩托车零件购物网站:Demon Tweeks
2018/10/29 全球购物
金融管理应届生求职信
2014/02/20 职场文书
cf搞笑广告词
2014/03/14 职场文书
医院见习报告范文
2014/11/03 职场文书
2014年技术工作总结范文
2014/11/20 职场文书
2016年“5.12”护士节致辞
2015/07/31 职场文书
预备党员表决心的话
2015/09/22 职场文书
2019奶茶店创业计划书范本,值得你借鉴
2019/08/14 职场文书