PHP   发布时间:2019-11-13  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了php截取html字符串及自动补全html标签的方法大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

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

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

title"> 代码如下:
** * 截取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",$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,$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,$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;
    }

实例,代码如下:
<div class="codetitle"><a style="cursOR: pointer" data="75319" class="copybut" id="copybut75319" onclick="doCopy('code75319')"> 代码如下:
<div class="codebody" id="code75319"> @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; / 字符串指针 @H_616_143@/
    $stag=array(array()); / 存放开始HTML的标志 @H_616_143@/
    $etag=array(array()); / 存放结束HTML的标志 @H_616_143@/
    $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,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,$i).$ends;
    if($morE) $re.='...';
    return $re;
    }


    php截取字符串,生成文章摘要,我们在写BLOG时经常需要显示文章前一部分,但是又怕不恰当截断破坏封闭标签以造成整个文档结构破坏,代码如下:
    <div class="codetitle"><a style="cursOR: pointer" data="53293" class="copybut" id="copybut53293" onclick="doCopy('code53293')"> 代码如下:
    <div class="codebody" id="code53293">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,$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();

    @H_415_0@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截取html字符串及自动补全html标签的方法全部内容,希望文章能够帮你解决php截取html字符串及自动补全html标签的方法所遇到的程序开发问题。

    如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

    本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
    如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。