ホームページ  >  記事  >  バックエンド開発  >  PHP は HTML 文字列をインターセプトし、HTML タグを自動的に完了します_PHP チュートリアル

PHP は HTML 文字列をインターセプトし、HTML タグを自動的に完了します_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-20 11:11:08950ブラウズ

文章来总结一下关于利用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("~]*?>~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 .= '';
 }
 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);
s s s t t-- t - =0;
$i=0; /**文字列ポインタ **/
$stag=array(array()); /**HTMLを開始するフラグを格納します **/
$etag=array(array()); * HTML を終了するフラグを格納します **/
$sp /$re.=substr($str,$i,3 );
if ( $str[$i+1] == '!')
$i+1]= = '/')$ etag;

for(;$i<$leng;$i++)
{
if ($str[$i] == ' ')
{
$ptag[$k] = implode('',$ptag[$k] );
$k++;
Break;
}
if ($str[$i] != '>')
{
$ptag[$k][]=$str[$i];
続き;
}
else
{
$ptag[$k] implode('',$ptag[$k]);
$k++;
休憩;
}
}
$i++;
続き;
}
その他
{
//$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 = '';
$re = substr($str,0,$i).$ends;
if($more) $re.='...';
return $re;
}

PHP は文字列をインターセプトし、記事の概要を生成します
ブログを書くとき、記事の前の部分を表示する必要があることがよくありますが、不適切な切り捨てにより終了タグが損傷し、文書構造全体に損傷を与える可能性があります

コードは次のとおりです コードをコピーします
function text_zhaiyao($text,$length){ //記事概要生成関数 $test:content$length:summary length
global $Briefing_Length;
mb_regex_encoding ("UTF-8");
if(mb_strlen($text ) $Foremost = mb_substr($text, 0, $length);
$re = "<(/ ?)
(P|DIV|H1|H2|H3|H4 |H5|H6|アドレス|プリ|テーブル|TR|TD|TH|入力|選択|テキストエリア|オブジェクト|A|UL|OL|LI|
BASE |META|LINK|HR|PARAM|IMG|AREA| $Stack = Array (); $POSSTACK = Array ();
/* [子マッチング式]:

$matche[1] : 現在の「<...>」が
終了部分であるかどうかを示す "/" 文字
$matche[2] : 要素名。
$matche [3] : "<.. .>" フリクション
*/
if($match[1]==""){
$Elem = $match[2];
if(mb_eregi ($Single, $Elem) && $match[3] ! =""){
続き;
}








http://www.bkjia.com/PHPjc/444659.htmlwww.bkjia.com
本当

http://www.bkjia.com/PHPjc/444659.html

この記事では、php を使用して HTML 文字列をインターセプトし、HTML タグを自動的に完成させる方法についてまとめています。実際の開発では、多くの人が、strip_tags を使用して HTML タグを直接フィルタリングしますが、純粋な...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。