2011-06-24 59 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\>' –