Maison  >  Article  >  développement back-end  >  Comment tronquer du texte HTML sans casser les balises ?

Comment tronquer du texte HTML sans casser les balises ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-12 09:44:01825parcourir

How to Truncate HTML Text Without Breaking Tags?

Tronquer du texte HTML sans casser les balises

Lors de la troncature de texte contenant du HTML, il est crucial de s'assurer que les balises sont correctement gérées pour éviter de casser le mise en page et flux de contenu.

Le problème :

Dans les méthodes traditionnelles, les balises sont incluses dans le texte tronqué, ce qui entraîne des balises incomplètes ou cassées. Cela peut perturber le formatage, créer un contenu déroutant et potentiellement déclencher des problèmes de nettoyage Tidy.

La solution :

Pour résoudre ce problème, il est nécessaire d'analyser le code HTML et garder une trace des balises ouvertes. En fermant les balises ouvertes avant de tronquer le texte, on peut garantir l'intégrité des balises.

Implémentation PHP :

Le code PHP suivant montre comment tronquer le texte HTML tout en préservant la structure des balises. :

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

Utilisation :

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

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!

Déclaration:
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