如何在JavaScript中使用regexp检测标记子集?

时间:2010-11-25 13:45:56

标签: javascript regex tags

我想在JavaScript字符串中检测是否有一些标签,而不是我拥有的列表。这意味着如果在我的String中有不合需要的标签,那么我会检测它们。

我所做的是:

var expression = new RegExp("<[^(BR|SPAN|STRONG|STRIKE|EM|U|FONT)]*>", "gi");

if (expression.test(aString)) {
      // detection
}

但这个正则表达似乎不起作用..

有没有人有想法?

2 个答案:

答案 0 :(得分:0)

你可能想要这样的东西:

var expression = new RegExp("<(BR|SPAN|STRONG|STRIKE|EM|U|FONT) ?[^>]*>", "gi");

...并反转您的测试(即如果此测试 true 则找到错误的标签)

您尝试的[^...]解决方案仅适用于字符及其设置,而不适用于字符串。

我以[^>]*>结尾,这意味着“任何不是>的任何数量,后跟>”,这样你也会抓住元素有属性。

修改

正如MSalters指出的那样,我似乎误解了你的问题。你不想反转表达式,而是想要做这样的事情

var expression = new RegExp("<(?!BR|SPAN|STRONG|STRIKE|EM|U|FONT) ?[^>]*>", "gi");

如果它测试 true ,那么您的输入包含不在上面列表中的标记。

答案 1 :(得分:0)

你可以反转你想要的测试,但这很难。

你想要找到的大致是<([^BSEUF].*|U[^ >]+|B|B[^R].*|BR[^ >]+|E|E[^M].*|EM[^ >]+|||||) - 我遗漏了与S一起盯着标签的部分,但是你应该得到这种模式。首先,我捕获任何不以B,S,E,U或F开头的东西。接下来我抓住任何以U开头的东西,但在U之后有额外的字符(例如<UA>)。第三种情况捕获<B>。第四个案例捕获<BA><BAA>。第五个案例抓住了<E>。第6个案例抓住了<BRA>。第7个案例捕获<EA><EAA>,第8个案例捕获<EMA>

要完成此操作,您必须抓住<SPA><SA><SPAA><SPANA>等等:标签不同,因为它们是(1)简短,(2)在某个共享前缀之后不同,或(3)长于可接受的标签。