簡體   English   中英

使用正則表達式刪除Flex / AS3中的HTML標簽

[英]Use regular expressions to remove HTML tags in Flex/AS3

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

提前致謝。

您不能將任意嵌套的結構與正則表達式匹配,因為嵌套意味着不規則。 解析器(您正在編寫)是正確的工具。

現在,在這種非常特殊的情況下,您可以

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>等)。

假設您的目標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;
}

以我的經驗,僅使用regex解析復雜的html就是地獄。 正則表達式很快就失控了。 提取所需信息(也許使用簡單的正則表達式)並將它們組合回更簡單的文檔中,它的功能要強大得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM