首页 > 后端开发 > php教程 > 如何将纯文本 URL 转换为 HTML 中的可点击链接,同时保留标签内的 URL?

如何将纯文本 URL 转换为 HTML 中的可点击链接,同时保留标签内的 URL?

Barbara Streisand
发布: 2024-11-01 17:06:02
原创
369 人浏览过

How to Convert Plain Text URLs to Clickable Links in HTML While Preserving URLs Within Tags?

在转换非标记 URL 时保留 HTML 标记中的 URL

在 HTML 文档中,可能需要将纯文本 URL 转换为可点击的 URL链接,同时排除已包含在 HTML 标记中的 URL。这可能会带来挑战,因为许多常见的文本替换方法也会无意中定位标记的 URL。

问题陈述

以下 HTML 文本片段说明了遇到的问题:

<code class="html"><p>I need you help here.</p>
<p>I want to turn this:</p>
<pre class="brush:php;toolbar:false">sometext sometext http://www.somedomain.com/index.html sometext sometext

into:

sometext sometext <a href=&quot;http://somedoamai.com/index.html&quot;>www.somedomain.com/index.html</a> sometext sometext

However, the existing regex solution also targets URLs within img tags:

sometext sometext <img src=&quot;http//domain.com/image.jpg&quot;> sometext sometext

Converting this accidentally produces:

sometext sometext <img src=&quot;<a href=&quot;http//domain.com/image.jpg&quot;>domain.com/image.jpg</a>&quot;> sometext sometext
**Solution** To effectively isolate and replace URLs that are not within HTML tags, we can leverage XPath and DOM manipulation. Using an XPath query, we can select text nodes containing URLs while excluding those that are descendants of anchor tags:
登录后复制

$texts = $xPath->query(

'/html/body//text()[
    not(ancestor::a) and (
    contains(.,&quot;http://&quot;) or
    contains(.,&quot;https://&quot;) or
    contains(.,&quot;ftp://&quot;) )]'
登录后复制

);

Once these text nodes are identified, we can replace them with document fragments containing the appropriate anchor elements. This ensures that the URLs are converted without affecting the surrounding HTML structure:
登录后复制

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);
登录后复制

}

以上是如何将纯文本 URL 转换为 HTML 中的可点击链接,同时保留标签内的 URL?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板