ホームページ >バックエンド開発 >PHPチュートリアル >タグ内の URL に影響を与えずに、HTML テキスト内の URL をリンクに変換するにはどうすればよいですか?

タグ内の URL に影響を与えずに、HTML テキスト内の URL をリンクに変換するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-29 07:26:021060ブラウズ

 How to Convert URLs in HTML Text to Links without Affecting URLs within Tags?

タグ内の URL に影響を与えずに HTML テキスト内の URL をリンクに変換する

あなたの苦境には、テキスト URL のみをリンクに変換する方法が必要です。 HTML コンテンツ内のクリック可能なリンク。ただし、現在使用しているパターンでは、タグ内の URL も意図せず変換されます。

DOM と XPath を利用した正確なアプローチ

この問題に対処するには、 DOM (ドキュメント オブジェクト モデル) と XPath を使用します。具体的には、XPath を使用すると、HTML ドキュメントを走査し、正確な基準に基づいて特定の要素を選択できます。この場合、URL を含み、アンカー () 要素の子孫ではないテキスト ノードを識別する必要があります。

次の XPath クエリはこれを効果的に実現できます:

/html/body//text()[
    not(ancestor::a) and (
        contains(., "http://") or
        contains(., "https://") or
        contains(., "ftp://")
    )
]

このクエリでは、アンカーに属さず、サポートされている URL プロトコルの少なくとも 1 つを含むテキスト ノードのみが考慮されます。

テキスト ノードを動的に変換

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);
}
関連するテキスト ノードの場合、PHP の PREG_REPLACE 関数を使用してその内容を変更できます。テキストを対応するアンカー タグで置き換える方法は次のとおりです。

このコードはドキュメント フラグメントを作成し、PREG_REPLACE パターンを使用して各フラグメント内のテキストを変更し、元のテキスト ノードを変更されたフラグメントで置き換えます。

このアプローチに従うと、タグ内の URL を除外しながら、テキスト URL をクリック可能なリンクに効果的に変換でき、必要な機能を提供できます。

以上がタグ内の URL に影響を与えずに、HTML テキスト内の URL をリンクに変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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