2016-05-12 125 views
-1

我有一些不正當地嵌套HTML,如:正則表達式剝離HTML標記某些屬性

<form class="form1" method="get"> 
    <div> 
     <input name="field1"> 

    </form> 

    <form class="form2" method="get"> 
     <input name="field1"> 
    </form> 

</div> 

是啊,這是一個爛攤子,不問。無效的嵌套在其他地方造成問題。我認爲jQuery預計關閉</div>,並且只在最後一個找到它。然後,將第二個<form>標記視爲無效,並且丟棄正上方的結束</form>,並假定第1行和第9行之間的所有內容都是一種形式。

如果我將這些輸出到控制檯:

  • $('.form1).html() - 所有線的1 - 9
  • $('.form2).html() - 未定義

那麼我現在要做的是把整個東西作爲一個字符串,並使用正則表達式去除form2。我期待一個正則表達式是這樣的:

formText.replace(/(<form\b[^>]*>)[^<>]*(<\/form>)/gi, ""); 

,但我不知道如何與class=form2引用的具體形式。
這也是一個多行字符串的問題。

更新:添加更多細節,概述爲什麼jQuery的remove()方法不起作用。 jQuery只認爲不幸有一種形式。

+3

[不使用正則表達式解析HTML/XML或任何其他非正規語言(HTTP:// stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454) –

+1

不要修復損壞的HTML。只是不要讓它突破。 –

+0

@ Frederik.L感謝您的有益見解。 – duncan

回答

0

我最終使用:

formText = formText.replace(/(<form\b[^>]*form2+.*>[\s\S]+<\/form>)/gi, ""); 

[\s\S]匹配所有字符,包括\n\r覆蓋換行。

我可能已經使正則類處理類名的部分更具體,所以我知道它是類,而不是其他類似的隨機形式,但在實踐中並不重要(只有第二種形式的一個實例,具有非常具體的類名稱)。

+0

也感謝https://regex101.com/#javascript – duncan

+0

當你從DOM中刪除表單時,你如何獲得一個可用的'formText'? – 4castle

+0

第二種形式沒有從DOM中刪除。當我得到'$(.form1).html()'它給了我所有的行1-9 – duncan

2

Don't use regex to parse HTML.由於您使用jQuery的,只是使用.remove()

$(function() { 
    $(".form2").remove(); 
}); 

JSFiddle

+0

很好,不幸的是它不起作用。 HTML比我最初提出的問題更糟糕;我會更新它以顯示真正的問題。它無效嵌套。所以事實證明'$(「。form2」)'實際上不是作爲HTML元素存在的。 – duncan

+0

@duncan [它適用於我。](https://jsfiddle.net/mxq4rnyd/2/)你確定沒有別的原因導致它?你準備好了嗎? – 4castle

+0

我認爲我的示例HTML不夠準確:它的無效結構。我需要想出一個更好的例子來證明問題! – duncan