Rumah >pembangunan bahagian belakang >tutorial php >Bagaimana untuk Menggantikan URL Teks dengan Hiperpautan Semasa Mengecualikan URL dalam Teg HTML?

Bagaimana untuk Menggantikan URL Teks dengan Hiperpautan Semasa Mengecualikan URL dalam Teg HTML?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-28 06:28:021107semak imbas

How to Replace Text URLs with Hyperlinks While Excluding URLs within HTML Tags?

Mengatasi Cabaran Mengganti URL Teks sambil Mengecualikan URL dalam Teg HTML

Masalah: Menukar URL teks kepada hiperpautan boleh menjadi tugas yang berguna, tetapi ia menjadi mencabar apabila imej atau elemen lain dalam teg HTML juga mengandungi URL. Dalam keadaan tertentu, pengguna mencari cara untuk menggantikan URL teks dengan teg sauh sambil mengelak daripada menggantikan URL yang dibenamkan dalam atribut sumber imej.

Penyelesaian:

Kunci untuk menangani isu ini terletak pada penggunaan ungkapan XPath untuk memilih hanya nod teks yang mengandungi URL tetapi bukan turunan elemen utama.

Berikut ialah versi halus ungkapan XPath:

$xPath = new DOMXPath($dom);
$texts = $xPath->query(
    '/html/body//text()[
        not(ancestor::a) and (
        contains(.,"http://") or
        contains(.,"https://") or
        contains(.,"ftp://") )]'
);

Ungkapan ini berkesan mengecualikan nod teks yang terkandung dalam teg sauh, memastikan bahawa hanya URL teks biasa disasarkan untuk penukaran.

Menggantikan URL Teks tanpa Menjejaskan URL Imej:

Untuk mengelakkan menggantikan URL yang dibenamkan dalam atribut sumber imej, pendekatan yang tidak standard tetapi cekap digunakan. Daripada memisahkan nod teks, serpihan dokumen digunakan untuk menggantikan keseluruhan nod teks dengan versi yang diubah suai.

Berikut ialah kod yang melaksanakan tugas ini:

foreach ($texts as $text) {
    $fragment = $dom->createDocumentFragment();
    $fragment->appendXML(
        preg_replace(
            &quot;~((?:http|https|ftp)://(?:\S*?\.\S*?))(?=\s|\;|\)|\]|\[|\{|\}|,|\&quot;|'|:|\<|$|\.\s)~i&quot;,
            '<a href=&quot;&quot;></a>',
            $text->data
        )
    );
    $text->parentNode->replaceChild($fragment, $text);
}

Dalam kod ini, fungsi preg_replace digunakan untuk mencari URL dalam nod teks dan menggantikannya dengan versi tag anchor yang sepadan.

Contoh:

Pertimbangkan HTML berikut:

<code class="html"><html>
<body>
<p>
    This is a text with a <a href=&quot;http://example.com/1&quot;>link</a>
    and another <a href=&quot;http://example.com/2&quot;>http://example.com/2</a>
    and also another http://example.com with the latter being the
    only one that should be replaced. There is also images in this
    text, like <img src=&quot;http://example.com/foo&quot;/> but these should
    not be replaced either. In fact, only URLs in text that is no
    a descendant of an anchor element should be converted to a link.
</p>
</body>
</html></code>

Menggunakan penyelesaian di atas akan menukar URL teks kepada teg sauh sambil membiarkan URL imej tidak disentuh, menghasilkan output berikut:

<code class="html"><html><body>
<p>
    This is a text with a <a href=&quot;http://example.com/1&quot;>link</a>
    and another <a href=&quot;http://example.com/2&quot;>http://example.com/2</a>
    and also another <a href=&quot;http://example.com&quot;>http://example.com</a> with the latter being the
    only one that should be replaced. There is also images in this
    text, like <img src=&quot;http://example.com/foo&quot;/> but these should
    not be replaced either. In fact, only URLs in text that is no
    a descendant of an anchor element should be converted to a link.
</p>
</body></html></code>

Atas ialah kandungan terperinci Bagaimana untuk Menggantikan URL Teks dengan Hiperpautan Semasa Mengecualikan URL dalam 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