我正在Flex(AS3)中编写HTML解析器,我需要删除一些不需要的HTML标记。
例如,我想从此代码中删除div:
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<p style="padding-left: 18px; padding-right: 20px; text-align: center;">
<span></span>
<span style=" font-size: 48px; color: #666666; font-style: normal; font-weight: bold; text-decoration: none; font-family: Arial;">20% OFF.</span>
<span> </span>
<span style=" font-size: 48px; color: #666666; font-style: normal; font-weight: normal; text-decoration: none; font-family: Arial;">Do it NOW!</span>
<span> </span>
</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
并以这样的结尾结束:
<div>
<p style="padding-left: 18px; padding-right: 20px; text-align: center;">
<span></span>
<span style=" font-size: 48px; color: #666666; font-style: normal; font-weight: bold; text-decoration: none; font-family: Arial;">20% OFF.</span>
<span> </span>
<span style=" font-size: 48px; color: #666666; font-style: normal; font-weight: normal; text-decoration: none; font-family: Arial;">Do it NOW!</span>
<span> </span>
</p>
</div>
我的问题是,如何编写正则表达式来删除这些不需要的DIV?有没有更好的方法呢?
提前致谢。
答案 0 :(得分:2)
You can't match arbitrarily nested constructs with a regular expression因为嵌套意味着不规则。解析器(您正在编写)是正确的工具。
现在在这个非常特殊的情况下,你可以做一个
result = subject.replace(/^\s*(<\/?div>)(?:\s*\1)*(?=\s*\1)/mg, "");
(这将简单地删除所有直接后续出现的<div>
或</div>
除了最后一个),但这在很多方面都很糟糕,我担心它会让我被遗忘
解释:
^ # match start of line
\s* # match leading whitespace
(</?div>) # match a <div> or </div>, remember which
(?:\s*\1)* # match any further <div> or </div>, same one as before
(?=\s*\1) # as long as there is another one right ahead
你能算出这些方法会失败吗? (想想评论,无与伦比的<div>
等)。
答案 1 :(得分:1)
假设您的目标HTML实际上是有效的XML,您可以使用递归函数来拖出非div位。
static function grabNonDivContents(xml:XML):XMLList {
var out:XMLList = new XMLList();
var kids:XMLList = xml.children();
for each (var kid:XML in kids) {
if (kid.name() && kid.name() == "div") {
var grandkids:XMLList = grabNonDivContents(kid);
for each (var grandkid:XML in grandkids) {
out += grandKid;
}
} else {
out += kid;
}
}
return out;
}
答案 2 :(得分:0)
根据我的经验,用正则表达式解析复杂的html只是地狱。正则表达式正在迅速失控。提取您需要的信息(可能使用简单正则表达式)并将它们组装回更简单的文档中会更加健壮。