我正在尝试组建一个RegExp
来替换字符串中的所有网址,其中的链接元素除了已经是现有链接href
属性的网址外。
此Regexp将所有网址(包括href
s)转换为新的锚元素:
/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig
这是不希望的。 Codepen。
如何只替换不是href
现有链接元素的网址?
答案 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>