php使HTML标签自动补全闭合函数代码

作者:ca88编程

fixHtmlTag
version 0.2
本条本子消除了上次遗留的主题材料,即就近闭合和嵌套闭合难题。具体能够看代码的解说。

轻易易行说美赞臣些代码:
第一个 ~(<[^>] ?>)~si
以此正则是匹配<………>中的内容。轻易说是全体的<标签>。
第二个 ~<([a-z0-9] )[^/>]*?/>~si
本条正则是相配<……/>中的内容。是单闭合标签 如<br />
第三个 ~</([a-z0-9] )[^/>]*?>~si
本条正则是相配</......>中的内容。也便是甘休标签 如</a>
第四个 ~<([a-z0-9] )[^/>]*?>~si
相配<......>中的内容。那和第三个是不平等的,这叁个是真正的html标签,因为html标签唯有数字和字母,如:<h1></h1>
第五个 ~<!--.*?-->~si
不用解释了,HTMl的笺注
剩余的能够看源代码了,php源码附属类小部件:

正文实例汇报了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;

<?php

<?php
/**
* 取HTML,并自动补全闭合
*
* param $html
*
* param $length
*
* param $end
*/
function subHtml($html, $length=50) {
$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 (!empty($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-f][x80-xbf]|[xf1-xf7][x80-xbf][x80-xbf][x80-xbf]/", $text, $ar);
$length = count($ar[0]);
}
return $length;
}
$str = "<div><table>x<tr>1s<td>测试<td>124";
echo subHtml($str);
?>

复制代码 代码如下:

 $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;
 }

/**
* fixHtmlTag
*
* HTML标签修复函数,此函数可以修复未准确闭合的 HTML 标签
*
* 由于不明显因素太多,一时提供二种格局“嵌套闭合情势”和
* “就近闭合形式”,应该丰富了。
*
* 那三种格局是自己为领悟释清楚此函数的贯彻而创设的五个名词,
* 只需驾驭怎样看头就行。
* 1,嵌套闭合形式,NEST,为默认的密封格局。即 "<body><div>你好"
* 这样的 html 代码会被修改为 "<body><div>你好</div></body>"
* 2,就近闭合方式,CLOSE,这种方式会将形如 "<p>你好<p>为何未有
* 闭合呢" 的代码修改为 "<p>你好</p><p>为什么一向不关掉呢</p>"
*
* 在嵌套闭合情势(暗中同意,没有供给特别传参)下,能够流传要求就近闭合的
* 标签字,通过这种办法将类似 "<body><p>你好</p><p>小编也好" 转变为
* "<body><p>你好</p><p>我也好</p></body>"的形式。
* 传参时索引要求依照如下方式写,没有须求修改的装置能够差相当少
*
* $param = array(
* 'html' => '', //必填
* 'options' => array(
* 'tagArray' => array();
* 'type' => 'NEST',
* 'length' => null,
* 'lowerTag' => TRUE,
* 'XHtmlFix' => TRUE,
* )
* );
* fixHtmlTag($param);
*
* 上边索引对应的值含义如下
* string $html 供给修改的 html 代码
* array $tagArray 当为嵌套方式时,须求就近闭合的价签数组
* string $type 格局名,近日帮忙 NEST 和 CLOSE 三种情势,若是设置为 CLOSE,将会忽略参数 $tagArray 的安装,而全部内外闭合全体标签
* ini $length 假如希望截断一定长度,可以在此赋值,此尺寸指的是字符串长度
* bool $lowerTag 是或不是将代码中的标签全体改换为小写,默认为 TRUE
* bool $XHtmlFix 是还是不是管理不符合 XHTML 标准的标签,就要 <br> 转变为 <br />
*
* @author IT不倒翁 <itbudaoweng@gmail.com>
* @version 0.2
* @link IT不倒翁
* @link 某某
* @param array $param 数组参数,须求给予特定的目录
* @return string $result 经过管理后的 html 代码
* @since 2012-04-14
*/
function fixHtmlTag($param = array()) {
//参数的暗许值
$html = '';
$tagArray = array();
$type = 'NEST';
$length = null;
$lowerTag = TRUE;
$XHtmlFix = TRUE;

你大概感兴趣的稿子:

  • php截取html字符串及机动补全html标签的艺术
  • PHP实现HTML标签自动补全代码
  • PHP正则表明式过滤html标签属性(DEMO)
  • PHP完结过滤各个HTML标签
  • php过滤表单提交的html等高危代码
  • php过滤HTML标签、属性等正则表明式汇总
  • 浅析php过滤html字符串,幸免SQL注入的形式
  • php正则过滤html标签、空格、换行符的代码(附表达)
  • php 正则 过滤html 的超链接
  • php完全过滤HTML,JS,CSS等标签
  • PHP完结网页内容html标签补全和过滤的格局小结【2种艺术】

/**
 * 截取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;
}

 }
 }
 while(!empty($tagStack)){
 $result .= '</'.array_pop($tagStack).'>';
 }
 return  $result;
}

//首先得到一维数组,即 $html 和 $options (倘若提供了参数)
extract($param);

实例,代码如下:

/**
 * 截取普通话字符串
 * @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;
 }

//若是存在 options,提取相关变量
if (isset($options)) {
extract($options);
}

复制代码 代码如下:

 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];
 }
 }

$result = ''; //最后要回去的 html 代码
$tagStack = array(); //标签栈,用 array_push() 和 array_pop() 模拟实现
$contents = array(); //用来贮存在 html 标签
$len = 0; //字符串的始发长度

* @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;
}

 return $strcut.$dot;
}

本文由ca88发布,转载请注明来源

关键词: ca88网址 ca亚洲城