URLs innerhalb von HTML-Tags beibehalten und gleichzeitig URLs ohne Tags konvertieren
In HTML-Dokumenten kann es wünschenswert sein, reine Text-URLs in anklickbare URLs umzuwandeln Links, während URLs ausgeschlossen werden, die bereits in HTML-Tags enthalten sind. Dies kann eine Herausforderung darstellen, da viele gängige Textersetzungsmethoden versehentlich auch getaggte URLs ins Visier nehmen.
Problembeschreibung
Der folgende HTML-Textausschnitt veranschaulicht das aufgetretene Problem:
<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 ($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);
}
Das obige ist der detaillierte Inhalt vonWie konvertiert man reine Text-URLs in anklickbare Links in HTML und behält dabei die URLs innerhalb der Tags bei?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!