【问题标题】:Adding a negative lookahead to a URL matching Regex向匹配正则表达式的 URL 添加负前瞻
【发布时间】:2012-12-02 12:58:00
【问题描述】:

所以我试图用锚标记中的 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!所以我需要在这个正则表达式中添加一个负前瞻,以防止它匹配任何带有尾随 "' 的网址。

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

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

【问题讨论】:

    标签: javascript regex negative-lookahead


    【解决方案1】:

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

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

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

    【讨论】:

    • 我尝试切换到这里提供的功能:jsfiddle.net/mAJkL 横穿 DOM 节点,这是我应该使用的吗?
    • @JacksonGariety 看起来更好,是的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 2011-10-14
    • 2010-12-17
    相关资源
    最近更新 更多