2017-07-14 8 views
1

構造を保存するHTMLタグを含む文字列を切り捨てたいとします。HTMLタグ構造を保存する文字列を切り捨てます

例:私は52にサブストリングのITの最大文字数を設定している場合

Hello! My name is Jerald and here is a link to my <a href="#">Blog</a>. 

だから、私はそれは次のような文字列を返すことを期待:

Hello! My name is Jerald and here is a link to my <a href="#">Bl</a> 

私はstrip_tagsstrlen機能を使用しようとしましたhtmlタグを使用せずに、またサブ文字列の新しい長さを設定する(htmlタグ付きの+サイズなしのサイズ)。しかし、この方法はHTMLの文字列を壊しています。

+2

CSSを使用してみませんか?省略記号を使用すると、データを切り捨ててデータを失うよりも優れています。 –

+1

HTML記事(ニュース記事やブログ記事など)を持っていて、その記事のティーザーを印刷したい場合など、PHPで行うことができます。もちろん、通常のように切り詰めることもできますが、HTMLブロックの途中で停止する可能性があります。 – alistaircol

答えて

1

私はこれではなく、私のコードを使用しますが、私はもともとそれを見つけた場所を見つけることができません。

function truncateHTML($html_string, $length, $append = '&hellip;', $is_html = true) { 
    $html_string = trim($html_string); 
    $append = (strlen(strip_tags($html_string)) > $length) ? $append : ''; 
    $i = 0; 
    $tags = []; 

    if ($is_html) { 
    preg_match_all('/<[^>]+>([^<]*)/', $html_string, $tag_matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER); 

    foreach($tag_matches as $tag_match) { 
     if ($tag_match[0][1] - $i >= $length) { 
     break; 
     } 

     $tag = substr(strtok($tag_match[0][0], " \t\n\r\0\x0B>"), 1); 
     if ($tag[0] != '/') { 
     $tags[] = $tag; 
     } 
     elseif (end($tags) == substr($tag, 1)) { 
     array_pop($tags); 
     } 

     $i += $tag_match[1][1] - $tag_match[0][1]; 
    } 
    } 

    return substr($html_string, 0, $length = min(strlen($html_string), $length + $i)) . (count($tags = array_reverse($tags)) ? '</' . implode('></', $tags) . '>' : '') . $append; 
} 

例:

Hello! My name is Jerald and here is a link to my <a href="#">Bl</a>&hellip; 

デモ:

$my_input_with_html = 'Hello! My name is Jerald and here is a link to my <a href="#">Blog</a>.'; 
$my_output_with_correct_html = truncateHTML($my_input_with_html, 52); 

があなたに与えます: https://eval.in/832674

これが役立つことを願っています。

関連する問題