4

この文字列は、HTMLを含む78文字とHTMLを含まない39文字です。

<p>I really like the <a href="http://google.com">Google</a> search engine.</p>

HTML以外の文字数に基づいてこの文字列を切り捨てたいので、たとえば、上記の文字列を24文字に切り捨てたい場合、出力は次のようになります。

I really like the <a href="http://google.com">Google</a>

切り捨ては、切り捨てる文字数を決定するときにhtmlを考慮せず、削除された数のみを考慮しました。ただし、HTMLタグを開いたままにしませんでした。

4

1 に答える 1

9

さて、これは私がまとめたものであり、機能しているようです:

function truncate_html($string, $length, $postfix = '&hellip;', $isHtml = true) {
    $string = trim($string);
    $postfix = (strlen(strip_tags($string)) > $length) ? $postfix : '';
    $i = 0;
    $tags = []; // change to array() if php version < 5.4

    if($isHtml) {
        preg_match_all('/<[^>]+>([^<]*)/', $string, $tagMatches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
        foreach($tagMatches as $tagMatch) {
            if ($tagMatch[0][1] - $i >= $length) {
                break;
            }

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

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

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

使用法:

truncate_html('<p>I really like the <a href="http://google.com">Google</a> search engine.</p>', 24);

関数は(小さな変更を加えて)取得されました:

http://www.dzone.com/snippets/truncate-text-preserving-html

于 2012-09-07T01:06:53.440 に答える