Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Melakukan Carian dan Gantikan pada Kandungan HTML Semasa Mengabaikan Teg HTML?

Bagaimana untuk Melakukan Carian dan Gantikan pada Kandungan HTML Semasa Mengabaikan Teg HTML?

Barbara Streisand
Barbara Streisandasal
2024-11-16 16:42:03953semak imbas

How to Perform Search and Replace on HTML Content While Ignoring HTML Tags?

Mengabaikan Tag HTML dalam preg_replace

Apabila menggunakan preg_replace untuk melakukan operasi carian dan menggantikan pada rentetan yang mengandungi HTML, selalunya wajar untuk mengabaikan tag HTML dan hanya mengubah suai kandungan teks sebenar. Walau bagaimanapun, ini boleh mencabar menggunakan ungkapan biasa sahaja, kerana ia tidak sesuai untuk menghurai HTML.

Satu pendekatan alternatif ialah menggunakan DOMDocument dan DOMXPath untuk mengendalikan struktur HTML. Dengan memanfaatkan pertanyaan XPath, adalah mungkin untuk mencari nod teks dalam dokumen HTML yang sepadan dengan kriteria carian, dan kemudian membalut nod tersebut dengan elemen HTML yang diingini tanpa menjejaskan teg HTML yang lain.

Sebagai contoh, pertimbangkan coretan kod berikut yang mengelakkan gangguan teg HTML:

$str = '...'; // HTML document

$search = 'text to highlight';

$doc = new DOMDocument;
$doc->loadXML($str);
$xp = new DOMXPath($doc);

$anchor = $doc->getElementsByTagName('body')->item(0);
if (!$anchor) {
    throw new Exception('Anchor element not found.');
}

// XPath query to locate text nodes containing the search text
$r = $xp->query('//*[contains(., "'.$search.'")]/*[FALSE = contains(., "'.$search.'")]/..', $anchor);
if (!$r) {
    throw new Exception('XPath failed.');
}

// Process search results
foreach($r as $i => $node) {
    $textNodes = $xp->query('.//child::text()', $node);
    $range = new TextRange($textNodes);

    // Identify matching text node ranges
    $ranges = array();
    while (FALSE !== $start = $range->indexOf($search)) {
        $base = $range->split($start);
        $range = $base->split(strlen($search));
        $ranges[] = $base;
    }

    // Wrap matching text nodes with HTML elements
    foreach($ranges as $range) {
        foreach($range->getNodes() as $node) {
            $span = $doc->createElement('span');
            $span->setAttribute('class', 'search_highlight');
            $node = $node->parentNode->replaceChild($span, $node);
            $span->appendChild($node);
        }
    }
}

echo $doc->saveHTML();

Kod ini menggunakan pertanyaan XPath untuk mencari nod teks yang mengandungi istilah carian, dan kemudian mencipta kelas TextRange untuk mengurus subjulat dalam nod teks. Setiap julat padanan kemudiannya dibalut dalam elemen span dengan kelas tersuai, yang boleh digunakan untuk penyerlahan atau tujuan lain.

Dengan menggunakan DOMDocument dan DOMXPath dan bukannya bergantung semata-mata pada ungkapan biasa, pendekatan ini menyediakan pendekatan yang lebih cekap dan cara yang boleh dipercayai untuk mengabaikan teg HTML semasa melakukan carian dan menggantikan operasi pada kandungan HTML.

Atas ialah kandungan terperinci Bagaimana untuk Melakukan Carian dan Gantikan pada Kandungan HTML Semasa Mengabaikan Teg HTML?. 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