Heim >Backend-Entwicklung >PHP-Tutorial >Wie konvertiert man reine Text-URLs in anklickbare Links in HTML und behält dabei die URLs innerhalb der Tags bei?

Wie konvertiert man reine Text-URLs in anklickbare Links in HTML und behält dabei die URLs innerhalb der Tags bei?

Barbara Streisand
Barbara StreisandOriginal
2024-11-01 17:06:02370Durchsuche

How to Convert Plain Text URLs to Clickable Links in HTML While Preserving URLs Within Tags?

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=&quot;http://somedoamai.com/index.html&quot;>www.somedomain.com/index.html</a> sometext sometext

However, the existing regex solution also targets URLs within img tags:

sometext sometext <img src=&quot;http//domain.com/image.jpg&quot;> sometext sometext

Converting this accidentally produces:

sometext sometext <img src=&quot;<a href=&quot;http//domain.com/image.jpg&quot;>domain.com/image.jpg</a>&quot;> 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(.,&quot;http://&quot;) or
    contains(.,&quot;https://&quot;) or
    contains(.,&quot;ftp://&quot;) )]'

);

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(
        &quot;~((?:http|https|ftp)://(?:\S*?\.\S*?))(?=\s|\;|\)|\]|\[|\{|\}|,|\&quot;|'|:|\<|$|\.\s)~i&quot;,
        '<a href=&quot;&quot;></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!

Stellungnahme:
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