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]+)[^>]*>|&#?[a-zA-Z0-9]+;|[\x80-\xFF][\x80-\xBF]*}' : '{</?([a-z]+)[^>]*>|&#?[a-zA-Z0-9]+;}'; // Iterate through the HTML while ($printedLength < $maxLength && 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] == '&' || 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>&lt;Hello&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>&#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!