我有一段文字可能包含一些明文链接,或一些实际上链接的链接。
例如:
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&#=.\/\-?_]+)
但是,我仍然无法区分这些案例。
这需要在javascript中,所以我不认为允许负面的背后隐藏。
任何帮助都将不胜感激。
编辑:我试图将未经过格式化的链接包装在标签中。
答案 0 :(得分:4)
您可以使用此正则表达式获取标记之外的网址:
(?![^<]*>|[^<>]*<\/)((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;
&#13;
<div id="res"/>
&#13;
<强>更新强>:
要允许捕获特定标记内部,您可以将它们列入白名单like this:
var re = /(?![^<]*>|[^<>]*<\/(?!(?:p|pre)>))((https?:)\/\/[a-z0-9&#=.\/\-?_]+)/gi;