正则表达式在html中捕获多行脚本标记

时间:2012-03-23 17:27:51

标签: c# html regex tags

我需要在html页面中获取内联脚本标记。 正则表达式最终将由c#驱动。 现在我正在使用Expresso进行测试。

以下是目前最好的:

.*<script.*\r\n(.*\r\n)*\s*</script>

  • .*<script抓住脚本标记
  • .*\r\n抓住任何东西直到行尾
  • (.*\r\n)*抓住剧本的其他部分
  • \s*</script>抓住结束脚本,前面有任何缩进

它抓取第一个标记之间的所有内容,包含html和其他脚本标记。

4 个答案:

答案 0 :(得分:4)

同一行上的两个脚本会破坏你的正则表达式。在您的问题的页面源上尝试它。

使用正则表达式解析HTML不是一个好主意(在您的问题的评论中有一个链接answers为什么 <center>无法容纳< / em>的);改为使用HTML解析器。

下一个代码段使用HtmlAgilityPack

选择<script>个节点
var doc = new HtmlDocument();
doc.Load(html);
var scripts = doc.DocumentNode.SelectNodes("//script");

这不是比正则表达式更简单吗?

答案 1 :(得分:1)

如何启用&#34;点匹配所有&#34;并使用简单的东西:

<script\b[^>]*>(.*?)</script>

请记住,匹配与捕获不同。这应该捕获($ 1)标签之间的内容。我使用http://regexpal.com/

进行了快速测试

在Eclipse中使用bosinski.com/regex(我知道它不是C#)这里是我的测试文件(后面是结果):

<html>
<SCRIPT LANGUAGE="JavaScript"><!--
function demoMatchClick() {
  var re = new RegExp(document.demoMatch.regex.value);
  if (document.demoMatch.subject.value.match(re)) {
    alert("Successful match");
  } else {
    alert("No match");
  }
}
// -->
</SCRIPT>
<script language="fred">
this is the second set of code
</script>
</html>

正则表达式匹配的结果:

Found 2 match(es):

start=8, end=275
Group(0) = <SCRIPT LANGUAGE="JavaScript"><!--
function demoMatchClick() {
  var re = new RegExp(document.demoMatch.regex.value);
  if (document.demoMatch.subject.value.match(re)) {
    alert("Successful match");
  } else {
    alert("No match");
  }
}
// -->
</SCRIPT>
Group(1) = <!--
function demoMatchClick() {
  var re = new RegExp(document.demoMatch.regex.value);
  if (document.demoMatch.subject.value.match(re)) {
    alert("Successful match");
  } else {
    alert("No match");
  }
}
// -->

start=277, end=344
Group(0) = <script language="fred">
this is the second set of code
</script>
Group(1) = 
this is the second set of code

答案 2 :(得分:1)

根据您的要求,您有不同的问题。你的问题是,你在html上使用正则表达式,或者你的量词太贪心。

我不知道你想要解决的问题,但很可能,你的解决方案应该是使用html解析器。

如果您想坚持使用正则表达式,请使用量词*?的ungreedy版本。你的正则表达式看起来像这样

.*<script.*\r\n(.*\r\n)*?\s*</script>

这意味着它将匹配所需的行数,直到第一个结束标记为止。

答案 3 :(得分:0)

Try this

<(?<tag>script*)[^>]*>(?<content>.*?)<\/\k<tag>>

script之后的单词<tag>替换为其他元素名称,您也可以将其用于其他元素名称。