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如何编写易读的代码
Jul 10 PHP
php获取网页内容方法总结
Dec 04 PHP
PHP 一个页面执行时间类代码
Mar 05 PHP
深入理解用mysql_fetch_row()以数组的形式返回查询结果
Jun 05 PHP
php在线解压ZIP文件的方法
Dec 30 PHP
php+mysqli批量查询多张表数据的方法
Jan 29 PHP
php上传大文件设置方法
Apr 14 PHP
thinkPHP简单遍历数组方法分析
May 16 PHP
php文件上传后端处理小技巧
May 22 PHP
PHP自定义函数实现格式化秒的方法
Sep 14 PHP
thinkPHP5框架实现基于ajax的分页功能示例
Jun 12 PHP
imagettftext() 失效,不起作用
Mar 09 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脚本的10个技巧(3)
2006/10/09 PHP
php环境配置 php5 MySQL5 apache2 phpmyadmin安装与配置图文教程
2007/03/16 PHP
PHP mkdir()定义和用法
2009/01/14 PHP
PHP学习笔记(一) 简单了解PHP
2014/08/04 PHP
php编写批量生成不重复的卡号密码代码
2015/05/14 PHP
ThinkPHP中类的构造函数_construct()与_initialize()的区别详解
2017/03/13 PHP
Prototype使用指南之dom.js
2007/01/10 Javascript
jQuery 动画基础教程
2008/12/25 Javascript
解决jQuery插件tipswindown与hintbox冲突
2010/11/05 Javascript
js 动态文字滚动的例子
2011/01/17 Javascript
js中的onchange和onpropertychange (onchange无效的解决方法)
2014/03/08 Javascript
在Node.js中实现文件复制的方法和实例
2014/06/05 Javascript
JavaScript处理解析JSON数据过程详解
2015/09/11 Javascript
Bootstrap组件系列之福利篇几款好用的组件(推荐二)
2016/07/12 Javascript
微信公众号支付H5调用支付解析
2016/11/04 Javascript
jQuery Ajax 实现在html页面实时显示用户登录状态
2016/12/30 Javascript
jquery学习笔记之无new构建详解
2017/12/07 jQuery
python使用线程封装的一个简单定时器类实例
2015/05/16 Python
Python中转换角度为弧度的radians()方法
2015/05/18 Python
Python计算一个文件里字数的方法
2015/06/15 Python
Python基于pygame实现的font游戏字体(附源码)
2015/11/11 Python
python数据结构链表之单向链表(实例讲解)
2017/07/25 Python
python3处理含有中文的url方法
2018/05/10 Python
Python 使用类写装饰器的小技巧
2018/09/30 Python
在Python中实现函数重载的示例代码
2019/12/12 Python
Python 虚拟环境工作原理解析
2020/12/24 Python
CSS3制作缩略图的详细过程
2016/07/08 HTML / CSS
猎人靴英国官网:Hunter Boots
2017/02/02 全球购物
英国No.1体育用品零售商:SportsDirect.com
2019/10/16 全球购物
俄罗斯药房连锁店:ASNA
2020/06/20 全球购物
戴森比利时官方网站:Dyson BE
2020/10/03 全球购物
请写出 float x 与"零值"比较的 if 语句
2016/01/04 面试题
1亿有多大教学反思
2014/05/01 职场文书
优秀教师推荐材料
2014/12/16 职场文书
2016党员读书思廉心得体会
2016/01/23 职场文书
高二化学教学反思
2016/02/22 职场文书