【问题标题】:Auto-link URL with javascript Regex使用 javascript 正则表达式自动链接 URL
【发布时间】:2015-04-20 12:21:19
【问题描述】:

我有一段文本可能包含一些纯文本链接,或者一些链接实际上链接。

例如:

Posting a link: http://test.com, posting an image <img src="http://test.com/2.jpg" />. Posting an actual A tag: <a href="http://test.com/test.html">http://test.com/test.html</a>

我需要从这段文字中找出未格式化的链接。因此,任何匹配第一种情况的正则表达式,但不匹配第二种或第三种情况,因为它们已经是格式良好的链接。

我已经设法用这个正则表达式找出所有链接:((http:|https:)\/\/[a-zA-Z0-9&amp;#=.\/\-?_]+),但是,我仍然无法区分这些情况。

这需要在 javascript 中,所以我认为不允许消极的后视。

任何帮助将不胜感激。

编辑:我正在尝试将捞出的未格式化链接包装在 a 标记中。

【问题讨论】:

标签: javascript jquery html regex


【解决方案1】:

您可以使用此正则表达式来获取标签之外的 URL:

(?![^<]*>|[^<>]*<\/)((http:|https:)\/\/[a-zA-Z0-9&#=.\/\-?_]+)

demo

我们也可以使用i 选项将其缩短一点:

(?![^<]*>|[^<>]*<\/)((https?:)\/\/[a-z0-9&#=.\/\-?_]+)

another demo

示例代码:

var re = /(?![^<]*>|[^<>]*<\/)((https?:)\/\/[a-z0-9&#=.\/\-?_]+)/gi; 
var str = 'Posting a link: http://test.com, posting an image <img src="http://test.com/2.jpg" />. Posting an actual A tag: <a href="http://test.com/test.html">http://test.com/test.html</a>';
var val = re.exec(str);
document.getElementById("res").innerHTML = "<b>URL Found</b>: " + val[1];
var subst = '<a href="$1">$1</a>'; 
var result = str.replace(re, subst);
document.getElementById("res").innerHTML += "<br><b>Replacement Result</b>: " + result;
&lt;div id="res"/&gt;

更新

要允许在特定标签内捕获,您可以将它们列入白名单like this

var re = /(?![^<]*>|[^<>]*<\/(?!(?:p|pre)>))((https?:)\/\/[a-z0-9&#=.\/\-?_]+)/gi;

【讨论】:

  • 我认为这个答案错过了一个案例:如果链接位于普通标签中,即不是 A 标签怎么办?例如&lt;p&gt;http://test.com&lt;/p&gt;
  • 嗯,这里最好的方法是使用 HTML 解析器和正则表达式。 &lt;p&gt; 是一个容器标签。如果您不想使用任何 HTML 解析器,您仍然可以尝试使用正则表达式:var re = /(?![^&lt;]*&gt;|[^&lt;&gt;]*&lt;\/(?!(?:p|pre)&gt;))((https?:)\/\/[a-z0-9&amp;#=.\/\-?_]+)/gi;。请查看regex101.com/r/mU5rR8/3
  • 我想我知道你是怎么做的。我真的希望避免使用 HTML 解析器。实际上,我只想不匹配 A 标记中的链接,而不匹配属于 HTML 属性的链接。所以那些格式错误的标签,比如[link]可以匹配,pre也可以匹配
  • (?![^|[^]*
猜你喜欢
  • 2012-09-21
  • 2012-06-08
  • 1970-01-01
  • 1970-01-01
  • 2020-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-09
相关资源
最近更新 更多