ホームページ >バックエンド開発 >PHPチュートリアル >タグ内の URL を保持しながら、プレーン テキスト URL を HTML のクリック可能なリンクに変換する方法

タグ内の URL を保持しながら、プレーン テキスト URL を HTML のクリック可能なリンクに変換する方法

Barbara Streisand
Barbara Streisandオリジナル
2024-11-01 17:06:02375ブラウズ

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

タグなし URL の変換中に HTML タグ内の URL を保持する

HTML ドキュメントでは、プレーン テキスト URL をクリック可能な URL に変換することが望ましい場合があります。 HTML タグ内に既に含まれている URL を除外しながら、リンクを作成します。一般的なテキスト置換メソッドの多くはタグ付けされた URL を誤ってターゲットにするため、これには課題が生じる可能性があります。

問題の説明

次の HTML テキスト スニペットは、発生した問題を示しています。

<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);

}

以上がタグ内の URL を保持しながら、プレーン テキスト URL を HTML のクリック可能なリンクに変換する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。