代码之家  ›  专栏  ›  技术社区  ›  Quad64Bit

正则表达式排除行为

  •  0
  • Quad64Bit  · 技术社区  · 14 年前

    好吧,我知道这个问题有好几次是以不同的形式被问到的,但是我在具体的语法方面遇到了困难。我有一个包含HTML代码段的大字符串。我需要找到每个还没有target=attribute的链接标签(这样我可以根据需要添加一个)。

    ^((?!target).)* 将给出“目标”前的文本,以及 <a.+?>[\w\W]+?</a> 会给我一个链接,但那就是我被卡住的地方。一个例子:

    <a href="http://www.someSite.com>Link</a> (This should be a match)
    <a href="SomeLink.whatever target="_blank">Link</a> (this should not be a match).  
    

    有什么建议吗?使用dom或xpath不是真正的选项,因为此代码段不是格式良好的HTML。

    4 回复  |  直到 14 年前
        1
  •  0
  •   Peter O'Callaghan    14 年前

    如果你坚持用regex来做,像这样的模式应该会有帮助…

    <a(?![^>]*target=) [^>]*>.*?</a>
    

    从技术上讲,标签绝对不是百分之百完美的,它可以在除“结束”之外的其他位置包含a>,因此它不适用于所有HTML标签。

    铌。我用PHP工作,您可能需要对Java进行轻微的语法调整。

        2
  •  2
  •   Kilian Foth    14 年前

    试图用正则表达式解析HTML,这是故意作恶。不要。

    也就是说,你试图在一个regexp中做任何事情,这是非常邪恶的。没有必要这样做;这会使您的代码依赖于regex引擎、不可读,并且可能非常慢。相反,只需匹配标签,然后用普通的regex再次检查第一阶段的点击量。 /target=/ . 当然,该字符串可能出现在HTML标记的其他位置,但请参见(1)…你已经把良好的实践抛到了窗外,那么为什么不至少让事情变得不模糊,让每个人都能看到你在做什么呢?

        3
  •  0
  •   burningstar4    14 年前

    你可以尝试这样的负面展望: <a(?!.*?target.*?).*?>[\w\W]+?</a>

        4
  •  0
  •   nickytonline    14 年前

    我没有测试这个,花了大约一分钟的时间编写它,但是对于您的特定示例,如果您可以在客户端进行测试,请通过dom进行尝试:

    var links = document.getElementsByTagName("a");
    
    for (linkIndex=0; linkIndex < links.length; linkIndex++) {
        var link = links[linkIndex];
    
        if (link.href && !link.target) {
            link.target = "someTarget"
            // or link.setAttribute("target", "someTarget");
        }
    }