Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Memotong Teks HTML Tanpa Memecahkan Teg?

Bagaimana untuk Memotong Teks HTML Tanpa Memecahkan Teg?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-12 09:44:01825semak imbas

How to Truncate HTML Text Without Breaking Tags?

Memotong Teks HTML tanpa Memecah Teg

Apabila memotong teks yang mengandungi HTML, adalah penting untuk memastikan bahawa teg dikendalikan dengan betul untuk mengelakkan pecahnya reka letak dan aliran kandungan.

Masalahnya:

Dalam kaedah tradisional, teg disertakan dalam teks yang dipotong, mengakibatkan teg tidak lengkap atau rosak. Ini boleh mengganggu pemformatan, mencipta kandungan yang mengelirukan dan berpotensi mencetuskan isu Pembersihan Kemas.

Penyelesaian:

Untuk menangani masalah ini, anda perlu menghuraikan HTML dan menjejaki tag terbuka. Dengan menutup teg terbuka sebelum memotong teks, seseorang boleh memastikan integriti teg.

Pelaksanaan PHP:

Kod PHP berikut menunjukkan cara memotong teks HTML sambil mengekalkan struktur teg :

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));
}

Penggunaan:

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");

Atas ialah kandungan terperinci Bagaimana untuk Memotong Teks HTML Tanpa Memecahkan Teg?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn