好的,所以我知道这个问题已经多次以不同的形式提出,但是我遇到了特定语法的问题。我有一个包含html片段的大字符串。我需要找到每个没有target =属性的链接标记(这样我就可以根据需要添加一个)。
^((?!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。
答案 0 :(得分:2)
通过尝试使用Regexes解析HTML,你是故意的。不。
那就是说,你试图在一个正则表达式中做所有事情,这是多么邪恶。没有必要;它使您的代码依赖于引擎依赖引擎,不可读,并且可能很慢。相反,只需匹配标签,然后使用简单的正则表达式/target=/
再次检查您的第一阶段匹配。当然,这个字符串可能出现在HTML标签的其他地方,但是看看(1)......你已经抛弃了良好的做法,所以为什么不至少让事情变得模糊,这样每个人都可以看到你的'干嘛?
答案 1 :(得分:0)
如果你坚持用Regex这样做,这样的模式应该有帮助......
<a(?![^>]*target=) [^>]*>.*?</a>
从技术上讲,它绝不是100%完美的标签可以包含&gt;在除此之外的其他位置,因此它不适用于所有HTML标记。
NB。我使用PHP,您可能需要对Java进行轻微的语法调整。
答案 2 :(得分:0)
您可以尝试这样的负面预测:
<a(?!.*?target.*?).*?>[\w\W]+?</a>
答案 3 :(得分:0)
我没有对此进行测试并花了大约一分钟编写它,但对于您的具体示例,如果您可以在客户端执行此操作,请通过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");
}
}