問題: テキスト 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( "~((?:http|https|ftp)://(?:\S*?\.\S*?))(?=\s|\;|\)|\]|\[|\{|\}|,|\"|'|:|\<|$|\.\s)~i", '<a href=""></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="http://example.com/1">link</a> and another <a href="http://example.com/2">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="http://example.com/foo"/> 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="http://example.com/1">link</a> and another <a href="http://example.com/2">http://example.com/2</a> and also another <a href="http://example.com">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="http://example.com/foo"/> 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 サイトの他の関連記事を参照してください。