이 기사의 예에서는 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("~([a-z0-9] )[^/>]*?>~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 .= ''.array_pop($tagStack).'>'
}
$결과 반환
}
/**
* 중국어 문자열 가로채기
* @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 = ''.implode('>',$stag).'>';
$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] !=""){
계속하다;
}
希望本文所述对大家程序设计有所帮助。