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

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

Linda Hamilton
リリース: 2024-10-29 07:26:02
オリジナル
1097 人が閲覧しました

 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 までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート