2016-05-12 92 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