2010-09-26 50 views
1

我正在寫Flex(AS3)中的HTML解析器,我需要刪除一些不需要的HTML標籤。使用正則表達式來刪除Flex/AS3中的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

您是否考慮過使用XML相關類而不是正則表達式來解析您的需求。畢竟HTML是或多或少的XML。檢查多個嵌套div標籤將會更容易。 – 2DH 2010-09-26 19:04:21

回答

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; 
} 
+0

工程完美!謝謝。在這種情況下,我總是確信XML格式正確,我對它有絕對的控制權。所以這個XML解決方案是完美的。 – oscarm 2010-10-01 23:17:49

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

0

根據我的經驗,解析複雜的HTML與正則表達式只是地獄。正則表達式正在迅速失控。提取您需要的信息(可能與簡單的正則表達式)並將其組裝成更簡單的文檔更加穩健。