2011-06-24 60 views
3

我想从使用C#和正则表达式的html文件中获取javascript代码。 我现在使用的代码如下:从html文件获取javascript代码

string js = Regex.Replace(code, @"^.*?\<script\s?.*?\>((.|\r\n)+?)\<\/script\>.*$", "$1", RegexOptions.Multiline); 

但是当我使用这个我得到剥去脚本标签完整的HTML代码。

有人可以帮助我吗?


我现在使用的HTML敏捷包用下面的代码:

var hwObject = new HtmlWeb(); 
     HtmlDocument doc = new HtmlDocument(); 
     doc.LoadHtml(code); 
     foreach (var script in doc.DocumentNode.Descendants("script").ToArray()) 
     { 
      string js = script.InnerText; 
      HtmlTextNode text = (HtmlTextNode)script.ChildNodes.Single(d => d.NodeType == HtmlNodeType.Text); 
      text.Text = TrimJs(js); 
     } 

但只有最后一个脚本代码中获得的替换。之前的javascripts消失。

+0

如果您可以自由决定这个决定,我会说您应该使用[HTML Agility Pack](http://htmlagilitypack.codeplex.com/)。 – Bobby

+0

从我的理解你只想得到脚本,你得到的只是脚本的一切吗? – ub1k

+0

我得到的HTML和脚本,但脚本标签已经消失。 – Jerodev

回答

9

你应该看看Html Agility Pack

与使用正则表达式相比,使用基于xml的解析器解析HTML通常要容易得多。

你可以使用这样的事情:

HtmlWeb hwObject = new HtmlWeb(); 
HtmlDocument htmldocObject = hwObject.Load("http://www..."); 
foreach(var script in doc.DocumentNode.Descendants("script").ToArray()) 
{ 
    string s = script.InnerText; 
    // Modify s somehow 
    HtmlTextNode text = (HtmlTextNode)script.ChildNodes 
         .Single(d => d.NodeType == HtmlNodeType.Text); 
    text.Text = s; 
} 
htmldocObject .Save("file.htm"); 
+0

这是一个很好的答案。根据@Ryan Gross的说法,我不得不说,HTML不是一种常规语言,而使用正则表达式来解析HTML通常不是一个好主意。 – FishBasketGordo

+0

这看起来不错,我还可以用其他东西替换脚本标记之间的代码吗? – Jerodev

+0

InnerText属性是只读的,但我认为你可以尝试设置Text属性。 –

0

删除该*(请使用以下正则表达式:\<script\s?.*?\>((.|\r\n)+?)\<\/script\>)。

+0

这有同样的结果。 – Jerodev

2

您需要删除"^.*?"".*$",因为这就是为什么包括一切,没有理由使用替换,当你正在寻找一个子。只需使用Regex.Match方法,你应该很好。

+0

是的,但我想在代码中稍后替换javascript。这只是为了测试我是否可以获得JavaScript代码。 – Jerodev

+0

好的,这可能是因为你的页面上有空的脚本。 试试这个: '\ ((。| \ r \ n)*?)\ <\/script\>' –