ホームページ >バックエンド開発 >PHPチュートリアル >タグを壊さずに HTML テキストを切り詰める方法

タグを壊さずに HTML テキストを切り詰める方法

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-12 09:44:01896ブラウズ

How to Truncate HTML Text Without Breaking Tags?

タグを分割せずに HTML テキストを切り詰める

HTML を含むテキストを切り詰める場合、タグが正しく処理されてタグが壊れないようにすることが重要です。レイアウトとコンテンツの流れ。

問題:

従来の方法では、切り詰められたテキストにタグが含まれるため、タグが不完全または壊れてしまいます。これにより、書式設定が乱れ、わかりにくいコンテンツが作成され、Tidy クリーンアップの問題が発生する可能性があります。

解決策:

この問題に対処するには、HTML と開いているタグを追跡します。テキストを切り詰める前に開いているタグを閉じることで、タグの整合性を確保できます。

PHP 実装:

次の PHP コードは、タグを保持しながら HTML テキストを切り詰める方法を示しています。構造:

function printTruncated($maxLength, $html, $isUtf8=true)
{
    // Initialization
    $printedLength = 0;
    $position = 0;
    $tags = array();

    // Regex pattern for matching HTML tags and entities
    $re = $isUtf8
        ? '{</?([a-z]+)[^>]*>|&amp;#?[a-zA-Z0-9]+;|[\x80-\xFF][\x80-\xBF]*}'
        : '{</?([a-z]+)[^>]*>|&amp;#?[a-zA-Z0-9]+;}';

    // Iterate through the HTML
    while ($printedLength < $maxLength &amp;&amp; preg_match($re, $html, $match, PREG_OFFSET_CAPTURE, $position))
    {
        // Extract tag and tag position
        list($tag, $tagPosition) = $match[0];

        // Print text leading up to the tag
        $str = substr($html, $position, $tagPosition - $position);
        $printedLength += strlen($str);

        // Handle the tag
        if ($tag[0] == '&amp;' || ord($tag) >= 0x80)
        {
            // Pass entity or UTF-8 sequence unchanged
            print($tag);
            $printedLength++;
        }
        else
        {
            if ($tag[1] == '/')
            {
                // Closing tag
                assert(array_pop($tags) == $match[1][0]); // Check for nested tags
                print($tag);
            }
            else if ($tag[strlen($tag) - 2] == '/')
            {
                // Self-closing tag
                print($tag);
            }
            else
            {
                // Opening tag
                print($tag);
                $tags[] = $match[1][0];
            }
        }

        // Continue after the tag
        $position = $tagPosition + strlen($tag);
    }

    // Print any remaining text
    if ($position < strlen($html))
        print(substr($html, $position, $maxLength - $printedLength));

    // Close open tags
    while (!empty($tags))
        printf('</%s>', array_pop($tags));
}

使用法:

printTruncated(10, '<b>&amp;lt;Hello&amp;gt;</b> <img src="world.png" alt="" /> world!'); print("\n");
printTruncated(10, '<table><tr><td>Heck, </td><td>throw</td></tr><tr><td>in a</td><td>table</td></tr></table>'); print("\n");
printTruncated(10, "<em><b>Hello</b>&amp;#20;w\xC3\xB8rld!</em>"); print("\n");

以上がタグを壊さずに HTML テキストを切り詰める方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。