Cara Mengecualikan Teg HTML dalam preg_replace
Kod yang disediakan cuba menyerlahkan hasil carian dalam rentetan menggunakan preg_replace. Walau bagaimanapun, kehadiran teg HTML dalam rentetan menimbulkan cabaran kerana operasi penggantian secara tidak sengaja menandai teg itu sendiri, memecahkan struktur HTML.
Penyelesaian: Menggunakan Pendekatan Berasaskan DOM
Ekspresi biasa bukanlah alat yang ideal untuk menghuraikan HTML. Sebaliknya, pertimbangkan untuk menggunakan DOM (Model Objek Dokumen) dan DOMXPath untuk menavigasi struktur XML rentetan anda.
DOMXPath membolehkan anda mencari elemen yang mengandungi teks tertentu, mengabaikan elemen XML. Ini membolehkan anda mengasingkan nod teks yang berkaitan dan membalutnya dalam teg rentang yang diingini.
Pelaksanaan Kod
Kod berikut menunjukkan cara melaksanakan pendekatan ini:
$doc = new DOMDocument; $doc->loadXML($str); $xp = new DOMXPath($doc); // Search elements containing the search text $r = $xp->query('//*[contains(., "'.$search.'")]/*[FALSE = contains(., "'.$search.'")]/..', $anchor); // Process search results foreach($r as $i => $node) { // Extract search text nodes and create suitable nodes if necessary $range = new TextRange($xp->query('.//child::text()', $node)); $ranges = array(); while(FALSE !== $start = strpos($range, $search)) { $base = $range->split($start); $range = $base->split(strlen($search)); $ranges[] = $base; }; // Wrap matching text nodes foreach($ranges as $range) { foreach($range->getNodes() as $node) { $span = $doc->createElement('span'); $span->setAttribute('class', 'search_hightlight'); $node = $node->parentNode->replaceChild($span, $node); $span->appendChild($node); } } }
Kod ini mencari elemen yang mengandungi teks carian, mengabaikan sebarang elemen kanak-kanak yang tidak mengandunginya. Kawasan carian diwakili sebagai objek TextRange, membenarkan penyisipan tag rentang di sekeliling teks yang sepadan. Hasilnya ialah rentetan XML yang diubah suai dengan hasil carian yang diserlahkan, tanpa melanggar struktur HTML.
Atas ialah kandungan terperinci Bagaimana untuk Menyerlahkan Hasil Carian dalam HTML Tanpa Memecahkan Struktur?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!