ホームページ  >  記事  >  バックエンド開発  >  テキスト URL の検出と置換から HTML タグを除外するにはどうすればよいですか?

テキスト URL の検出と置換から HTML タグを除外するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-28 04:53:30197ブラウズ

How to Exclude HTML Tags from Text URL Detection and Replacement?

テキスト URL の検出と置換から HTML タグを除外する

HTML 内の URL を除外して、プレーン テキスト URL を HTML アンカー タグに変換する探求タグを使用している場合、現在の正規表現では障害が発生しました。この記事は、この課題に対する包括的な解決策を提供することを目的としています。

現在の正規表現アプローチは、テキスト内の URL を効果的に検出して置換しますが、誤って HTML タグ内の URL をターゲットにすることもあります。これを修正するには、より的を絞ったアプローチを採用する必要があります。

XPath を使用して対象となる URL を特定する

広範囲のテキスト検索の代わりに、XPath を利用して正確に選択できます。アンカー要素の子孫ではない URL を含むテキスト ノード。これにより、HTML タグ内の URL は影響を受けなくなります。

$xPath = new DOMXPath($dom);
$texts = $xPath->query('/html/body//text()[not(ancestor::a) and (contains(., "http://") or contains(., "https://") or contains(., "ftp://"))]');

テキスト ノードをドキュメント フラグメントで置き換える

テキスト ノードを直接変更するのではなく、ドキュメントを使用します。フラグメントを使用して、テキスト ノード全体を目的の HTML に置き換えます。この非標準的な手法により、プロセスが合理化されます。

foreach ($texts as $text) {
    $fragment = $dom->createDocumentFragment();
    $fragment->appendXML(
        preg_replace("~((?:http|https|ftp)://(?:\S*?\.\S*?))(?=\s|\;|\)|\]|\[|\{|\}|,|\&quot;|'|:|\<|$|\.\s)~i", '<a href=&quot;&quot;></a>', $text->data)
    );
    $text->parentNode->replaceChild($fragment, $text);
}

出力

このアプローチでは、HTML 内の対象となる URL を除外しながら、プレーン テキストの対象となる URL を HTML アンカー タグに効果的に変換します。タグ。結果として得られる HTML には、不要な変更を加えることなく、目的の変換が反映されます。

以上がテキスト URL の検出と置換から HTML タグを除外するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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