Heim > Backend-Entwicklung > PHP-Tutorial > Wie kann ich Text-URLs durch Hyperlinks ersetzen und gleichzeitig URLs in HTML-Tags ausschließen?

Wie kann ich Text-URLs durch Hyperlinks ersetzen und gleichzeitig URLs in HTML-Tags ausschließen?

Mary-Kate Olsen
Freigeben: 2024-10-28 06:28:02
Original
1105 Leute haben es durchsucht

How to Replace Text URLs with Hyperlinks While Excluding URLs within HTML Tags?

Die Herausforderung meistern, Text-URLs zu ersetzen und gleichzeitig URLs in HTML-Tags auszuschließen

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://") )]'
);
Nach dem Login kopieren

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(
            &quot;~((?:http|https|ftp)://(?:\S*?\.\S*?))(?=\s|\;|\)|\]|\[|\{|\}|,|\&quot;|'|:|\<|$|\.\s)~i&quot;,
            '<a href=&quot;&quot;></a>',
            $text->data
        )
    );
    $text->parentNode->replaceChild($fragment, $text);
}
Nach dem Login kopieren

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=&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>
Nach dem Login kopieren

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=&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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage