ホームページ > バックエンド開発 > PHPチュートリアル > HTML タグ内の URL を除外しながらテキスト URL をハイパーリンクに置き換える方法

HTML タグ内の URL を除外しながらテキスト URL をハイパーリンクに置き換える方法

Mary-Kate Olsen
リリース: 2024-10-28 06:28:02
オリジナル
1085 人が閲覧しました

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

HTML タグ内の URL を除外しながらテキスト URL を置換するという課題を克服する

問題: テキスト URL をハイパーリンクに変換するのは便利なタスクです。しかし、HTML タグ内の画像やその他の要素にも URL が含まれている場合は、困難になります。特定の例では、ユーザーは、画像ソース属性内に埋め込まれた URL の置換を避けながら、テキスト URL をアンカー タグで置換する方法を探しています。

解決策:

この問題は、XPath 式を使用して URL を含むがアンカー要素の子孫ではないテキスト ノードのみを選択することで解決されます。

XPath 式の改良版は次のとおりです。

$xPath = new DOMXPath($dom);
$texts = $xPath->query(
    '/html/body//text()[
        not(ancestor::a) and (
        contains(.,"http://") or
        contains(.,"https://") or
        contains(.,"ftp://") )]'
);
ログイン後にコピー

この式は、アンカー タグ内に含まれるテキスト ノードを効果的に除外し、プレーン テキスト URL のみが変換の対象となるようにします。

画像 URL に影響を与えずにテキスト URL を置換する:

画像ソース属性内に埋め込まれた URL の置き換えを回避するために、非標準ではあるが効率的なアプローチが採用されています。テキスト ノードを分割する代わりに、ドキュメント フラグメントを使用してテキスト ノード全体を変更されたバージョンに置き換えます。

このタスクを実行するコードは次のとおりです。

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);
}
ログイン後にコピー

このコードでは、 preg_replace 関数は、テキスト ノード内の URL を検索し、対応するアンカー タグ バージョンに置き換えるのに使用されます。

例:

次の HTML について考えてみましょう:

<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>
ログイン後にコピー

上記の解決策を適用すると、画像 URL はそのままで、テキスト URL がアンカー タグに変換され、次の出力が生成されます。

<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>
ログイン後にコピー

以上がHTML タグ内の URL を除外しながらテキスト URL をハイパーリンクに置き換える方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート