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

Mary-Kate Olsen
Lepaskan: 2024-11-12 06:24:02
asal
276 orang telah melayarinya

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")]/..
Salin selepas log masuk

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
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan