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
Lepaskan: 2024-10-28 06:28:02
asal
1086 orang telah melayarinya

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

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

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

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

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!

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