>백엔드 개발 >PHP 튜토리얼 >php_php 기술에서 html 문자열을 가로채고 자동으로 html 태그를 완성하는 방법

php_php 기술에서 html 문자열을 가로채고 자동으로 html 태그를 완성하는 방법

WBOY
WBOY원래의
2016-05-16 20:25:441169검색

이 기사의 예에서는 PHP가 HTML 문자열을 가로채서 자동으로 HTML 태그를 완성하는 방법을 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요. 구체적인 분석은 다음과 같습니다.

다음은 PHP를 사용하여 HTML 문자열을 가로채고 자동으로 HTML 태그를 완성하는 방법을 요약한 것입니다. 실제 개발에서 많은 사람들이 먼저 Strip_tags를 사용하여 HTML 태그를 직접 필터링하지만 일반 텍스트만 남게 되는 경우가 많습니다. 읽을 수 있습니다. 여기에 함수가 있습니다. 코드는 다음과 같습니다.

코드 복사 코드는 다음과 같습니다.
/**
* HTML을 가로채서 자동으로 완성하고 닫습니다
* @param $html
* @param $length
* @param $end
​*/
function subHtml($html,$length) {
$결과 = ''
$tagStack = 배열()
$len = 0

$contents = preg_split("~(<[^>] ?>)~si",$html, -1,PREG_SPLIT_NO_EMPTY| PREG_SPLIT_DELIM_CAPTURE
foreach($contents를 $tag로)
{
if (trim($tag)=="") 계속
if(preg_match("~<([a-z0-9] )[^/>]*?/>~si",$tag)){
$결과 .= $태그
}else if(preg_match("~]*?>~si",$tag,$match)){
if($tagStack[count($tagStack)-1] == $match[1]){
array_pop($tagStack)
$결과 .= $태그
}
}else if(preg_match("~<([a-z0-9] )[^/>]*?>~si",$tag,$match)){
array_push($tagStack,$match[1])
$결과 .= $태그
}else if(preg_match("~~si",$tag)){
$결과 .= $태그
}그밖에{
if($len mstrlen($tag) < $length){
$결과 .= $태그
$len = mstrlen($tag)
}else {
$str = msubstr($tag,0,$length-$len 1)
$결과 .= $str
휴식
}

}
}
while(!emptyempty($tagStack)){
$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) {
$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; } elseif(194 <= $t && $t <= 223) {
$n = 2; } elseif(224 <= $t && $t <= 239) {
$n = 3; } elseif(240 <= $t && $t <= 247) {
$n = 4; } elseif(248 <= $t && $t <= 251) {
$n = 5; } elseif($t == 252 || $t == 253) {
$n = 6; } 다른 {
$n
}
$noc
if($noc >= $length) {
휴식
}
}
if($noc > $length) {
$n -= $tn
}
$strcut = 하위 문자열($string, 0, $n)
} 다른 {
for($i = 0; $i $strcut .= ord($string[$i]) > 127 ? $string[$i].$string[ $i] : $string[$i]; }
}

$strcut.$dot 반환
}

/**
* 중국어, 영어를 포함한 문자열의 길이를 구합니다.
​*/
함수 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)
} 그 밖의 {
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])
}
$length 반환
}

예를 들어 코드는 다음과 같습니다.
코드 복사 코드는 다음과 같습니다.
* @param HTML을 가로채기 $str
* @param 차단 횟수 $num
* @param $more를 더 추가해야 하나요
* @return 가로채기 문자열
*/
함수 phpos_chsubstr_ahtml($str,$num,$more=false)
{
$leng=strlen($str)
If($num>=$leng)
$str 반환
$워드=0
$i=0; /**문자열 포인터 **/
$stag=array(배열()) /**HTML을 시작하기 위한 플래그를 저장합니다 **/
$etag=array(배열()) /**HTML을 끝내는 플래그를 저장합니다 **/
$sp = 0
$ep = 0
동안($word!=$num)
          {
If(ord($str[$i])>128)
~ //$re.=substr($str,$i,3)
               $i =3
                 $워드
             }
            else if ($str[$i]=='<')
~ If ($str[$i 1] == '!')
~ >                          계속
~
If ($str[$i 1]=='/')
~ $ptag=&$etag
                    $k=&$ep
                    $i =2
~ 또 다른 ~ $ptag=&$stag
                    $i =1
                     $k=&$sp; ~
for(;$i<$leng;$i) ~ If ($str[$i] == ' ')
~                            $ptag[$k] = implode('',$ptag[$k])
> 휴식
| If ($str[$i] != '>')
~                    $ptag[$k][]=$str[$i];
                      계속하다;
                  }
                  그 외                
                  {
                    $ptag[$k] = 파열('',$ptag[$k]);
                    $k ;
                      부서지다;
                  }
              }
            $ 나는 ;
              계속하다;
          }
          그렇지 않으면
          {
            //$re.=substr($str,$i,1);
            $단어 ;
            $ 나는 ;
          }
      }
      foreach($etag를 $val로)
      {
        $key1=array_search($val,$stag);
          if ($key1 !== false)          unset($stag[$key]);
      }
      foreach($stag, $key => $val)
      {
          if (in_array($val,array('br','img'))) unset($stag[$key1]);
      }
    array_reverse($stag);
    $ends = '';
    $re = substr($str,0,$i).$ends;
      if($more)    $re.='...';
      $re를 반환합니다.
}

PHP截取字符串, 生成文章摘要, 우리는 写BLOG时经常需要显示文章前一分,但是又怕不恰当截断破坏封闭标签以造成整个文档结构破坏,代码如下:
复代码 代码如下:
함수 text_zhaiyao($text,$length){ //文章摘要生成函数  $test:内容 $length:摘要长島
    글로벌 $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";
     
    $스택 = 배열(); $posStack = 배열();
     
    mb_ereg_search_init($Foremost, $re, 'i');
     
    while($pos = mb_ereg_search_pos()){
    $match = mb_ereg_search_getregs();
    /* [자식 매칭 공식]:
     
    $matche[1] : 현재 "<...>"인지 여부를 나타내는 "/" 문자입니다. 마찰은
    마무리 부분
    $matche[2] : 요소 이름.
    $matche[3] : 오른쪽 > "<...>" 마찰
    */
    if($match[1]==""){
    $Elem = $match[2];
    if(mb_eregi($Single, $Elem) && $match[3] !=""){
    계속하다;
}

希望本文所述对大家程序设计有所帮助。

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.