2012-08-08 19 views
0

我一直經歷的正則表達式裏面的東西,並認爲我們有具有存儲在作爲字符串html標籤數組.. 像array=["</div>,"</a>", "<div id='test'>", "<a href='http://test/new.html'>", "</a>", "</div>", "<span style='color:#ffffff;'>"]正則表達式來比較變量html標籤

如果我們通過數組一個由一個,

如果我們要檢測完整的標籤和不完整的標籤,例如像 <div>是openened和 </div>其封閉後的位置..所以這兩個來自完全下...標籤是 <span>打開,但從來沒有

關閉,所以它屬於不完整的開放標籤,</div>在第一個位置接近d,所以它屬於不完整的封閉標籤。

這可以使用JavaScript來完成嗎?

+1

你只想匹配與封閉項目的未清項目?完美合理的Javascript。與正則表達式無關(如果我正確地理解了這個問題) – 2012-08-08 13:20:50

+0

是@ngmiceli ..它們按順序排列在數組 – 2012-08-08 13:22:17

回答

4

這聽起來像是教授Stack數據類型實用程序的一個很大的問題。在Javascript中,所有數組都使用堆棧函數,如here所示。

你怎麼做到的?

以空堆棧開始。 按順序循環遍歷數組的元素。對於每個項目:

  • 如果它是一個開放式標籤,請將其推入您的堆棧。
  • 如果是貼標籤,請從堆疊中彈出頂部項目
    • 檢查兩個標籤是否匹配。 (您必須關閉最近打開的項目,不是嗎?)
    • 如果沒有,失敗

最後,當你完成你的陣列,請檢查堆棧爲空。

  • 如果不是,則不是每個標籤都關閉。失敗
  • 如果是這樣,成功!

例如:

[<div>, <a>, <span>, </span>, </div>, </a>] 

將失敗。按div,按a,按span。流行音樂span。彈出a,不匹配div

它應該看起來像

[<div>, <a>, <span>, </span>, </a>, </div>] 

哪個會通,爲堆棧是空的(具有的0的長度)在該方法的結束。


編輯:如果你想在單獨的步驟來使用正則表達式:

要確定一個標籤是開放的:

tag.match(/<\//) == null 

此檢查標籤包含字符<\

獲取內容fr OM標籤:

var tagContent = tag.match(/\w+/)[0]; 

這抓起一組字字符。具體來說,第一組。它應該只抓取標籤名稱並忽略任何屬性,因爲空格將結束表達式。匹配總是返回一個數組,以防萬一您匹配全局(將有多個匹配),因此獲取返回數組的第0個索引以獲取該值。

若要比較兩個標籤:

tag1Content == tag2Content 

這嚴重不要求正則表達式。

+0

之內,但爲了比較標籤,我們必須使用正則表達式嗎? – 2012-08-08 13:51:42

+0

不一定!正則表達式通過模式匹配獲得它們的力量,在這種情況下你做的很少。你*可以*使用它們,但你不*有*。您只需要一種方法來確定標籤是打開還是關閉,並將文本取出。從那裏,它就像在「檢查兩個標籤匹配」步驟中的字符串比較一樣簡單,可以使用「equals」方法完成。你可以用正則表達式或者「手」來完成所有這些。 – 2012-08-08 13:55:00

0
var stack=new Array(); 
var stackCount = 0; 

var array=["</div>","<div id='test'>", "<a href='http://test/new.html'>", "</a>", "</div>", "<span style='color:#ffffff;'>"];  
     for(var k=0;k<array.length;k++) 
     { 
        alert("Eleemnt Selected:" + array[k]); 
        if(stackCount==0) 
         { 
         if(array[k].match(/<\//)==null) 
          { 
          stack.push(array[k]); 
          stackCount++; 
          alert("Pushed in to the stack as stack is empty" + stack); 
          } 
         else 
          { 
          alert("Ignored as it is a tag containing slash"); 
          } 

         } 
        else 
         { 
         var tagType1=array[k].match(/<\//); 
         var tagType2=stack[0].match(/<\//); 
         var cmpTag1=array[k].match(/\w+/); 
         var cmpTag2=stack[0].match(/\w+/); 

         //alert("Tag Type : Array element :" +tagType1 + "Stack element : " + tagType2 + "Tag Name: Array element : " + cmpTag1 + "Stack Element : " +cmpTag2); 
         if(cmpTag1!=cmpTag2 && tagType1!=tagType2) 
          { 

          stack.pop(); 
          stackCount--; 
          alert("same Tags, so popped out from the stack" + stack); 
          } 

         else 
         { 
         stack.push(array[k]); 
         stackCount++; 
         alert("Pushed in to the stack as items compared are different"); 
         } 
         } 



     } 

我發佈了我的答案......我試過了,這是我的位置......任何反饋或改進從你身邊?我關心的部分,因爲它是一個封閉的標籤,它應該彈出..對嗎?