RegExp获取除链接hrefs之外的所有URL

时间:2015-07-01 07:37:30

标签: javascript regex

我正在尝试组建一个RegExp来替换字符串中的所有网址,其中的链接元素除了已经是现有链接href属性的网址外。

此Regexp将所有网址(包括href s)转换为新的锚元素:

/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig

这是不希望的。 Codepen


如何只替换不是href现有链接元素的网址?

注意:
根据许多文档,Regex和RegExp都是相同且有效的。
MDNWikipediaMSDN

1 个答案:

答案 0 :(得分:2)

您需要确保自己不在<a>标记内。

您可以使用(?![^<>]*>(?:(?!<\/?a\b).)*<\/a>)前瞻来执行此操作(确保开头标记没有关闭角括号,并且不会跟随</a>标记。)

var urlToLinkExp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])(?![^<>]*>(?:(?!<\/?a\b).)*<\/a>)/ig;
                                                                                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

代码:

var urlToLinkExp = /(\b(?:https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])(?![^<>]*>(?:(?!<\/?a\b).)*<\/a>)/ig;


var el = document.getElementById('target');
el.innerHTML = el.innerHTML.replace(urlToLinkExp,"<a href='$1'>$1</a>");
p
{
  font-family: tahoma;
}
a
{
  background: #C7DBFC;
  color: #333;
  padding: 2px 4px;
}
<p id="target">
www.demo.com	http://example.com/ is a url 

https://example.com/foo.html?q=bar zxv xc zcv <a href="http://google.com" sadf >the href of this link is corrupted</a> dfg fgxc zcv <a href='http://google.com' sadf >the href of this link is <strong>corrupted</strong></a>
<p>

enter image description here