Comment tronquer un texte contenant du HTML tout en garantissant une fermeture correcte des balises ?

Mary-Kate Olsen
Libérer: 2024-11-12 03:39:01
original
602 Les gens l'ont consulté

How to Truncate Text Containing HTML While Ensuring Correct Tag Closure?

Tronquer du texte contenant du HTML tout en ignorant les balises

Lorsque vous tentez de tronquer du texte contenant du HTML, il est courant de rencontrer des problèmes où les balises ne sont pas fermées correctement. , conduisant à des résultats de troncature déformés. Pour surmonter ce problème, il est nécessaire d'analyser le HTML et de gérer les balises efficacement.

Voici une approche basée sur PHP qui garantit que les balises sont correctement fermées lors de la troncature :

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

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

    while ($printedLength < $maxLength && preg_match($re, $html, $match, PREG_OFFSET_CAPTURE, $position))
    {
        // 1. Handle text leading up to the tag
        $str = substr($html, $position, $match[0][1] - $position);
        if ($printedLength + strlen($str) <= $maxLength)
        {
            print($str);
            $printedLength += strlen($str);
        }
        else
        {
            print(substr($str, 0, $maxLength - $printedLength));
            $printedLength = $maxLength;
            break;
        }

        // 2. Handle the tag
        $tag = $match[0][0];
        if ($tag[0] == '&amp;' || ord($tag) >= 0x80)
        {
            // Pass the entity or UTF-8 character through unchanged
            print($tag);
            $printedLength++;
        }
        else
        {
            $tagName = $match[1][0];
            if ($tag[1] == '/')
            {
                // Closing tag
                $openingTag = array_pop($tags);
                assert($openingTag == $tagName); // Ensure proper tag nesting
                print($tag);
            }
            else if ($tag[strlen($tag) - 2] == '/')
            {
                // Self-closing tag
                print($tag);
            }
            else
            {
                // Opening tag
                print($tag);
                $tags[] = $tagName;
            }
        }

        $position = $match[0][1] + strlen($tag);
    }

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

    // 4. Close any open tags
    while (!empty($tags))
        printf('</%s>', array_pop($tags));
}
Copier après la connexion

Pour illustrer sa fonctionnalité :

printTruncated(10, '<b><Hello></b> <img src="world.png" alt="" /> world!'); // Output: <b><Hello></b> <img

printTruncated(10, '<table><tr><td>Heck, </td><td>throw</td></tr><tr><td>in a</td><td>table</td></tr></table>'); // Output: <table><tr><td>Heck

printTruncated(10, "<em><b>Hello</b>&amp;#20;w\xC3\xB8rld!</em>"); // Output: <em><b>Hello</b> w
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal