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( "~((?:http|https|ftp)://(?:\S*?\.\S*?))(?=\s|\;|\)|\]|\[|\{|\}|,|\"|'|:|\<|$|\.\s)~i", '<a href=""></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="http://example.com/1">link</a> and another <a href="http://example.com/2">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="http://example.com/foo"/> 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="http://example.com/1">link</a> and another <a href="http://example.com/2">http://example.com/2</a> and also another <a href="http://example.com">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="http://example.com/foo"/> 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!