Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Abaikan Teg HTML dengan Cekap Semasa Penggantian Ungkapan Biasa?

Bagaimana untuk Abaikan Teg HTML dengan Cekap Semasa Penggantian Ungkapan Biasa?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-12 06:24:02247semak imbas

How to Efficiently Ignore HTML Tags During Regular Expression Replacement?

Mengabaikan Teg HTML dalam Penggantian Ungkapan Biasa

Ungkapan biasa selalunya tidak mencukupi untuk mengendalikan tugas penghuraian HTML yang kompleks, terutamanya apabila menangani kes seperti secara terpilih mengabaikan tag. Sebaliknya, biasanya disyorkan untuk menggunakan DOMDocument dan DOMXPath untuk senario sedemikian.

Pendekatan Berasaskan DOMXPath

Untuk mengabaikan teg HTML semasa melakukan penggantian, DOMXPath boleh digunakan untuk secara terpilih mencari elemen teks dalam dokumen. Sebagai contoh, pertanyaan berikut akan menemui semua nod teks yang mengandungi istilah carian "span epal":

//*[contains(., "apple span")]/*[FALSE = contains(., "apple span")]/..

Mencipta Kelas Julat Teks

Kemudian, tersuai Kelas TextRange boleh dibuat untuk mewakili senarai nod teks DOM. Kelas ini membolehkan operasi rentetan dilakukan pada nod teks ini seolah-olah ia adalah rentetan tunggal.

Memproses Hasil Carian

Untuk setiap julat nod teks yang sepadan, < ;span> elemen boleh dibuat dan disisipkan di sekeliling nod teks untuk menyerlahkannya. Ini akan menjana hasil yang diingini tanpa menjejaskan teg HTML.

Contoh

Berikut ialah contoh kod yang menunjukkan pendekatan ini:

$doc = new DOMDocument;
$doc->loadXML('<html><body>This is some <span>text</span> that span</body></html>');
$xp = new DOMXPath($doc);

$anchor = $doc->getElementsByTagName('body')->item(0);
$r = $xp->query('//*[contains(., "span")]/*[FALSE = contains(., "span")]/..', $anchor);

foreach($r as $node)
{   
    $textNodes = $xp->query('.//child::text()', $node);
    $range = new TextRange($textNodes);
    while(FALSE !== $start = strpos($range, "span"))
    {
        $base = $range->split($start);
        $range = $base->split(strlen("span"));
        foreach($base->getNodes() as $node)
        {
            $span = $doc->createElement('span');
            $span->setAttribute('class', 'search_hightlight');
            $node = $node->parentNode->replaceChild($span, $node);
            $span->appendChild($node);
        }
    }
}

echo $doc->saveXML(); // Output the modified XML with highlighted text

Pendekatan ini membenarkan pengabaian teg HTML yang mantap dan cekap semasa operasi penggantian, memastikan hasil yang konsisten tanpa melanggar struktur HTML.

Atas ialah kandungan terperinci Bagaimana untuk Abaikan Teg HTML dengan Cekap Semasa Penggantian Ungkapan Biasa?. 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