Problem: Das Konvertieren von Text-URLs in Hyperlinks kann eine nützliche Aufgabe sein. Aber es wird schwierig, wenn Bilder oder andere Elemente innerhalb von HTML-Tags auch URLs enthalten. In einem bestimmten Fall sucht der Benutzer nach einer Möglichkeit, Text-URLs durch Anker-Tags zu ersetzen und gleichzeitig das Ersetzen von URLs zu vermeiden, die in Bildquellenattributen eingebettet sind.
Lösung:
Der Schlüssel zu Die Behebung dieses Problems besteht darin, einen XPath-Ausdruck zu verwenden, um nur die Textknoten auszuwählen, die URLs enthalten, aber keine Nachkommen von Ankerelementen sind.
Hier ist eine verfeinerte Version des XPath-Ausdrucks:
$xPath = new DOMXPath($dom); $texts = $xPath->query( '/html/body//text()[ not(ancestor::a) and ( contains(.,"http://") or contains(.,"https://") or contains(.,"ftp://") )]' );
Dieser Ausdruck schließt effektiv Textknoten aus, die in Anker-Tags enthalten sind, und stellt so sicher, dass nur reine Text-URLs für die Konvertierung ausgewählt werden.
Text-URLs ersetzen, ohne Bild-URLs zu beeinflussen:
Um zu vermeiden, dass in Bildquellenattributen eingebettete URLs ersetzt werden, wird ein nicht standardmäßiger, aber effizienter Ansatz verwendet. Anstatt Textknoten aufzuteilen, wird ein Dokumentfragment verwendet, um den gesamten Textknoten durch die geänderte Version zu ersetzen.
Hier ist der Code, der diese Aufgabe ausführt:
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); }
In diesem Code Die Funktion preg_replace wird verwendet, um im Textknoten nach URLs zu suchen und diese durch die entsprechenden Ankertag-Versionen zu ersetzen.
Beispiel:
Betrachten Sie den folgenden HTML-Code:
<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>
Durch die Anwendung der oben genannten Lösung werden die Text-URLs in Anker-Tags umgewandelt, während die Bild-URL unberührt bleibt, was zu der folgenden Ausgabe führt:
<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>
Das obige ist der detaillierte Inhalt vonWie kann ich Text-URLs durch Hyperlinks ersetzen und gleichzeitig URLs in HTML-Tags ausschließen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!