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的输入输出流
Feb 14 PHP
flash用php连接数据库的代码
Apr 21 PHP
phpMyAdmin出现无法载入 mcrypt 扩展,请检查PHP配置的解决方法
Mar 26 PHP
基于PHP服务端图片生成缩略图的方法详解
Jun 20 PHP
PHP调用C#开发的dll类库方法
Jul 28 PHP
PHP基于数组实现的分页函数实例
Aug 20 PHP
PHP循环遍历数组的3种方法list()、each()和while总结
Nov 19 PHP
隐性调用php程序的方法
Jun 13 PHP
WordPress的文章自动添加关键词及关键词的SEO优化
Mar 01 PHP
Ajax实现对静态页面的文章访问统计功能示例
Oct 10 PHP
php弹出提示框的是实例写法
Sep 26 PHP
PHP CURL实现模拟登陆并上传文件操作示例
Jan 02 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
WHOIS类的修改版
2006/10/09 PHP
PHP 输出缓存详解
2009/06/20 PHP
php用header函数实现301跳转代码实例
2013/11/25 PHP
PHP和Mysql中转UTF8编码问题汇总
2015/10/10 PHP
解读PHP中上传文件的处理问题
2016/05/29 PHP
PHP7.1新功能之Nullable Type用法分析
2016/09/26 PHP
php 反斜杠处理函数addslashes()和stripslashes()实例详解
2016/12/25 PHP
Aster vs Newbee BO3 第二场2.18
2021/03/10 DOTA
js类型检查实现代码
2010/10/29 Javascript
js Html结构转字符串形式显示代码
2011/11/15 Javascript
jquery 追加tr和删除tr示例代码
2013/09/12 Javascript
引用 js在IE与FF之间的区别详细解析
2013/11/20 Javascript
基于JS2Image实现圣诞树代码
2015/12/24 Javascript
JS代码实现table数据分页效果
2016/05/26 Javascript
js判断复选框是否选中及选中个数的实现代码
2016/05/30 Javascript
JS实现页面进入和返回定位到具体位置
2016/12/08 Javascript
webpack 代码分离优化快速指北
2019/05/18 Javascript
深入了解Vue.js 混入(mixins)
2020/07/23 Javascript
微信小程序实现点击导航条切换页面
2020/11/19 Javascript
[40:04]Secret vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.23
2019/09/05 DOTA
利用python 更新ssh 远程代码 操作远程服务器的实现代码
2018/02/08 Python
推荐8款常用的Python GUI图形界面开发框架
2020/02/23 Python
DogBuddy荷兰:找到你最完美的狗保姆
2019/04/17 全球购物
客户经理岗位职责
2013/12/08 职场文书
《回乡偶书》教学反思
2014/04/12 职场文书
红头文件任命书范本
2014/06/05 职场文书
行政秘书工作自我鉴定
2014/09/15 职场文书
中小学校园安全广播稿
2014/09/29 职场文书
2014年财务工作总结与计划
2014/12/08 职场文书
数学考试作弊检讨书300字
2015/02/16 职场文书
开工典礼致辞
2015/07/29 职场文书
导游词之秦始皇兵马俑博物馆
2019/09/29 职场文书
导游词之崇武古城
2019/10/07 职场文书
解决golang 关于全局变量的坑
2021/05/06 Golang
SQL Server中搜索特定的对象
2022/05/25 SQL Server
SQL解决未能删除约束问题drop constraint
2022/05/30 SQL Server