Rumah > Artikel > pembangunan bahagian belakang > Bagaimana untuk Memotong Teks yang Mengandungi HTML Sambil Memastikan Penutupan Teg Betul?
Memotong Teks yang Mengandungi HTML Semasa Mengabaikan Teg
Apabila cuba memotong teks yang mengandungi HTML, adalah perkara biasa untuk menghadapi isu di mana teg tidak ditutup dengan betul , membawa kepada keputusan pemotongan yang herot. Untuk mengatasinya, anda perlu menghuraikan HTML dan mengendalikan teg dengan berkesan.
Berikut ialah pendekatan berasaskan PHP yang memastikan teg ditutup dengan betul semasa pemangkasan:
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]+)[^>]*>|&#?[a-zA-Z0-9]+;|[\x80-\xFF][\x80-\xBF]*}' : '{</?([a-z]+)[^>]*>|&#?[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] == '&' || 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)); }
Untuk menggambarkan kefungsiannya:
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>&#20;w\xC3\xB8rld!</em>"); // Output: <em><b>Hello</b> w
Atas ialah kandungan terperinci Bagaimana untuk Memotong Teks yang Mengandungi HTML Sambil Memastikan Penutupan Teg Betul?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!