向匹配正则表达式的URL添加否定前瞻

时间:2012-12-02 12:58:00

标签: javascript regex negative-lookahead

所以我试着用锚标签中的那个URL替换我页面上多个元素中的所有文本URL:

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

var titles = document.querySelectorAll(".title");
var l = titles.length, i, title;
    for(i = 0; i < l; i++) {
    console.log('foo')
    title = titles[i];
    title.innerHTML = title.innerHTML.replace(/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig,"<a target='_blank' href='$1'>$1</a>")
}

问题是我必须在一些AJAX回来之后再次运行正则表达式并且它将锚标签重新应用于锚标签的href=""属性中的URL!因此,我需要为此正则表达式添加一个负向前瞻,以防止它使用尾随"'匹配任何网址。

匹配http://google.com但不匹配"http://google.com"

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

1 个答案:

答案 0 :(得分:2)

断言某些东西不在双引号内的一般先行技术是检查在字符串结尾之前是否存在偶数个:

yourPatternHere(?=[\s\S]*(?:"[\s\S]*"[\s\S])*$)

但是您正在使用HTML。这可能会导致各种问题(文本节点中不匹配的引号,注释,单引号分隔的属性值等)。 Don't use regular expressions to parse HTML。而是尽可能使用JavaScript的内置DOM操作功能。不要只找到.title元素,而是遍历它们的文本节点,并仅将替换应用于那些。