使用正则表达式删除Flex / AS3中的HTML标记

时间:2010-09-26 09:00:47

标签: regex flex actionscript-3

我正在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?有没有更好的方法呢?

提前致谢。

3 个答案:

答案 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只是地狱。正则表达式正在迅速失控。提取您需要的信息(可能使用简单正则表达式)并将它们组装回更简单的文档中会更加健壮。