0

因此,我尝试将页面上多个元素中的所有文本 URL 替换为锚标记中的 URL:

http://google.com=><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!所以我需要向这个正则表达式添加一个否定的前瞻,以防止它匹配任何带有尾随的 url"'.

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

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

4

1 回答 1

2

断言某些内容不在双引号内的一般前瞻技术是检查在字符串末尾是否有偶数个双引号:

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

但是您正在对 HTML 进行操作。这可能会导致各种问题(文本节点中不匹配的引号、注释、单引号分隔的属性值等等)。不要使用正则表达式来解析 HTML。而是尽可能使用 JavaScript 内置的 DOM 操作功能。不要只找到.title元素,而是遍历它们的文本节点并将替换仅应用于这些元素。

于 2012-12-02T13:03:33.783 回答