Memelihara URL Dalam Teg HTML sambil Menukar URL Tidak Teg
Dalam dokumen HTML, adalah wajar untuk menukar URL teks biasa kepada boleh diklik pautan sambil mengecualikan URL yang sudah terkandung dalam teg HTML. Ini boleh menimbulkan cabaran, kerana banyak kaedah penggantian teks biasa turut menyasarkan URL yang ditag secara tidak sengaja.
Pernyataan Masalah
Coretan teks HTML berikut menggambarkan isu yang dihadapi:
<code class="html"><p>I need you help here.</p> <p>I want to turn this:</p> <pre class="brush:php;toolbar:false">sometext sometext http://www.somedomain.com/index.html sometext sometext
into:
sometext sometext <a href="http://somedoamai.com/index.html">www.somedomain.com/index.html</a> sometext sometext
However, the existing regex solution also targets URLs within img tags:
sometext sometext <img src="http//domain.com/image.jpg"> sometext sometext
Converting this accidentally produces:
sometext sometext <img src="<a href="http//domain.com/image.jpg">domain.com/image.jpg</a>"> sometext sometext**Solution** To effectively isolate and replace URLs that are not within HTML tags, we can leverage XPath and DOM manipulation. Using an XPath query, we can select text nodes containing URLs while excluding those that are descendants of anchor tags:
$texts = $xPath->query(
'/html/body//text()[ not(ancestor::a) and ( contains(.,"http://") or contains(.,"https://") or contains(.,"ftp://") )]'
);
Once these text nodes are identified, we can replace them with document fragments containing the appropriate anchor elements. This ensures that the URLs are converted without affecting the surrounding HTML structure:
foreach ($teks sebagai $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);
}
Atas ialah kandungan terperinci Bagaimana untuk Menukar URL Teks Biasa kepada Pautan Boleh Klik dalam HTML Sambil Memelihara URL Dalam Teg?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!