使用正则表达式</form>从html文本中过滤<form>

时间:2015-01-29 08:23:36

标签: javascript html regex

我从ajax请求获取整个html页面作为文本(xmlhttp.responseText

然后过滤文本以从该文本和该表单中的所有内容中提取html form

我写了一个正则表达式:

text.match(/(<form[\W\w]*<\/form>)/gim)

由于我不是正则表达式的专家,所以我无法确定它是否适用于所有情况并将所有内容都放在form标记内?

有没有更好的方法可以说正则表达式中的一切? 所以正则表达式看起来像

 text.match(/(<form[__everything_syntaxt_here__]*<\/form>)/gim)

2 个答案:

答案 0 :(得分:1)

试试这个:

function stripForm(s) {
  var div = document.createElement('div');
  div.innerHTML = s;
  var scripts = div.getElementsByTagName('form');
  var i = scripts.length;
  while (i--) {
    scripts[i].parentNode.removeChild(scripts[i]);
  }
  return div.innerHTML;
}
function getForm(s) {
  var div = document.createElement('div');
  div.innerHTML = s;
  var scripts = div.getElementsByTagName('form');
  var i = scripts.length;
    var ret="";
  while (i--) {
    ret += scripts[i].innerHTML;
  }
  return ret;
}
var a = 'before Form <form action="" method="post"> <input type="text" /> <input type="text" /> <input type="text" /> </form><br/> after form';
alert(getForm(a));
alert(stripForm(a));
console.log(stripForm(a));

Demo

答案 1 :(得分:1)

不得不处理IE 5 ,你的灵魂很差。

快速回答您的问题 [\W\w]真的是绝对匹配所有内容的最佳方法吗?

,JavaScript不支持s修饰符,以使.匹配换行符。做[\W\w]基本上告诉正则表达式:&#34;匹配任何单词字符,或任何不是单词字符&#34; 的东西,你可以看到绝对每一个角色属于这两个类别。

但是,如果您想要一个更可靠的解决方案来处理页面上的<!-- html comments -->和多个表单,最好的方法就像 this SO answer < / strong>但已针对HTML进行了更改。

这就是我要用的:

<!--(?:(?!-->)[\w\W])*-->|(<form(?:(?:(?!<\/form>|<!--)[\w\W])|(?:<!--(?:(?!-->)[\w\W])*-->))*</form>)

Regular expression visualization

查看Debuggex Demo,了解您实际获得的匹配项。在JavaScript中,您可以期待第一个捕获组。如果它是空的,那就是删除评论的表单,如解释 here