Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Menyerlahkan Hasil Carian dalam HTML Tanpa Memecahkan Struktur?

Bagaimana untuk Menyerlahkan Hasil Carian dalam HTML Tanpa Memecahkan Struktur?

DDD
DDDasal
2024-11-13 00:30:02543semak imbas

How to Highlight Search Results in HTML Without Breaking the Structure?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn