2012-03-23 72 views
0

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

现在下面是最好的:

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

  • .*<script抓script标签
  • .*\r\n抓什么,直到行末的
  • (.*\r\n)*赶上其他线路剧本
  • \s*</script>捕捉结束脚本,之前有任何缩进

它抓住第一个标记之间的所有东西,包括html和其他脚本标记。

+6

你用正则表达式解析HTML有问题吗? [颜色我感到惊讶](http://stackoverflow.com/a/1732454/424509)! – CanSpice 2012-03-23 17:30:30

+1

如果你打算在C#中使用这个,请尝试http://htmlagilitypack.codeplex.com/ – Stephen 2012-03-23 17:40:07

+1

@CanSpice - 我认为这篇文章的受欢迎程度已经结束了“我可以将HTML的正则表达式”问题。可悲的是没有。 – David 2012-03-23 18:45:17

回答

4

同一行上的两个脚本会破坏你的正则表达式。试着在你的问题的网页来源。

解析HTML与正则表达式是不是一个很好的主意(存在于你的问题的评论这answers为什么<center>不能持有链接);改为使用HTML分析器。

下面的代码片段通过使用HtmlAgilityPack选择<script>节点:

var doc = new HtmlDocument(); 
doc.Load(html); 
var scripts = doc.DocumentNode.SelectNodes("//script"); 

这是不是比正则表达式simplier?

1

如何实现“点匹配所有”,用简单的东西:

<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 
1

根据你问的人,你有不同的问题。无论是你的问题是,你使用HTML的正则表达式,或量词太贪婪。

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

如果你想坚持使用正则表达式,那么使用量词*?的不确定版本。然后,您的正则表达式将是这个样子

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

,这意味着需要直到第一结束标记,将匹配的行数更少。

0

Try this

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

一词取代script<tag>与其他元素的名称后,你可以使用它的人太多。