正则表达式选择任何标签内的所有内容

时间:2014-09-22 05:55:30

标签: javascript html regex

目前我找到了一个正则表达式来查找任何<tag></tag>及其内容。

<([A-Z][A-Z0-9]*)\b[^>]*>(.*?)</\1>

如果我写irrevelant <tag>content</tag> even more irrevelant,我会得到我想要的内容<tag>content</tag>的确切标记。

当我尝试在嵌套标签上使用它时出现问题,例如:

<tag>gimme cookies<tag>gimme more cookies</tag></tag>

不幸的是,这次我得到了:

<tag>gimme cookies<tag>gimme more cookies</tag>

没有第二个结束标记。

我怎样才能改进正则表达式只能找到开始和结束标记以及它们之间的内容,所以我可以嵌套到无穷大以及更远的地方?

2 个答案:

答案 0 :(得分:1)

我建议采用Parse a HTML String with JS采用的方法采用更强大的方法,而不是将时间投入到复杂的正则表达式中。这会重复使用浏览器解析功能,而无需向页面添加内容。

var el = document.createElement( 'div' );
el.innerHTML = "<tag>gimme cookies<tag>gimme more cookies</tag></tag>";

var tags = el.getElementsByTagName( 'tag' );
var i;
for (i = 0; i < tags.length; i++) {
    console.log(tags[i].innerHTML);
}

如果您正在使用jQuery或现代浏览器,则可以使用$()或querySelector过滤掉您想要的内容。

答案 1 :(得分:0)

<哇哇,谈谈打开一罐蠕虫。 HTML非常不规则,你可能会疯狂地试图用正则表达式处理它。

让我们忽略可能存在看起来像标签但不是(例如,在评论或字符串中)的子串的可能性。你仍然需要一个能够处理递归的正则表达式引擎,而JavaScript并不是其中之一。

可以做的是(合理地,对于非常宽松的合理定义)确保你只使用

匹配最里面的标签
/<([A-Z][A-Z0-9]*)\b[^>]*>(?:(?!\/?\1)[\s\S])*<\/\1>/ig

然后保持匹配/替换,直到不再有匹配为止。当然,这仍然需要所有标签都正确嵌套(并且所有开口标签都是关闭的,反之亦然,这是你在现实生活中几乎看不到的东西)。

测试live on regex101.com