【问题标题】:How do I automatically wrap text URLs in anchor tags?如何在锚标记中自动换行文本 URL?
【发布时间】:2013-10-29 08:18:15
【问题描述】:

我有一个简单的CMS 为我的客户构建。

这个问题是,他可能不是通过锚标签发布链接,而是直接将其复制并粘贴到文本编辑器中。

有没有一种方法可以使用 JavaScript 将这些链接包装在锚标记中?因此,当页面加载而不是看起来链接时:

http://google.com

看起来像这样

<a href="http://google.com" target="_blank">http://google.com</a>

当用户发布答案/问题的 URL 时,Stack Overflow 实际上会这样做(如果这有助于理解我想要实现的目标)。

【问题讨论】:

标签: javascript jquery html anchor


【解决方案1】:

您可以尝试这些方法。使用 data-linkify 之类的自定义属性装饰您希望这些替换生效的标签:

<div data-linkify>something http://google.com something</div><div linkify>something</div>

现在在设置了data-linkify 的任何元素内执行替换。

$('*[data-linkify]').each(function() { 
  $(this).html($(this).html().replace(/(?:(https?\:\/\/[^\s]+))/m, '<a href="$1">$1</a>'));
});

有一些注意事项。这根本不是一个很好的正则表达式 — 它只匹配以http://https:// 开头的任何内容,直到第一个空格字符。寻找更好的 URL 匹配正则表达式。

另外,对.html() 使用replace 意味着它将破坏任何碰巧落在data-linkify 元素下的现有链接!如果文本链接中碰巧有双引号字符,则会创建损坏的锚元素。

您可以考虑使用某种非常简单的标记来识别链接 — 这比猜测要好得多。

【讨论】:

  • 我喜欢您的回答,但最好添加排除已用 a 标签装饰的 url 的条件,添加标识为 url 的字符串不得结束的条件就足够了使用字符串“”...对不起,我现在不能;-)
  • 据我所知,jQuery 不提供处理文本节点的工具;本机 DOM API 可以。如果您逐个替换每个 Text 节点,则不需要破坏 DOM 事件。例如,这段代码看起来运行良好(少于 600 个字符):
  • 该代码仍然具有非常简单的 URL 匹配,例如只有httphttps,虽然它匹配直到它碰到一个空格,在它之前有可选的标点符号,或者在字符串的结尾,所以https://example.com/a! https://example.com/b, https://example.com/c,d,e https://example.com/f 被解析为&lt;https://example.com/a&gt;! &lt;https://example.com/b&gt;, &lt;https://example.com/c,d,e&gt; &lt;https://example.com/f&gt;
  • Array.from(document.querySelectorAll("body,body *")).flatMap((res) =&gt; Array.from(res.childNodes)).filter(({nodeType, parentElement}) =&gt; nodeType === Document.TEXT_NODE &amp;&amp; !parentElement.closest("a,bb,button,details,select,textarea,option,script,noscript,style")).forEach((txt) =&gt; { const re = /\bhttps?:\/\/.+?(?=[.?!,]?(?:\s|$))/; while(re.test(txt.textContent)){ const { 0: { length }, 0: url, index: i } = txt.textContent.match(re); txt = txt.splitText(i).splitText(length); txt.previousSibling.replaceWith(Object.assign(document.createElement("a"), { href: url, textContent: url })); } });
猜你喜欢
  • 2013-03-28
  • 2015-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-06
  • 2019-02-27
相关资源
最近更新 更多