2014-06-29 32 views
-1
int firstTag = source.IndexOf("data-token="); 
int lastTag = source.IndexOf("\"href", firstTag); 
int startIndex = firstTag + 12; 
int endIndex = lastTag + 5; 
string authenticityToken = source.Substring(startIndex, endIndex - startIndex); 

我想分析的字符串是從這裏:我該如何解析使用indexof和substring的特定字符串?

<a class="bizLink" data-token="-iUzEhgdscgbpj5VMi5zoh54FTeFt8M4mj5nsiodxR5VzZOhniodpj6nFQg0nce3MhUxFSgdxjM4J 
jUVzZuNu8o0sREnFSUzISUXzZWh4iodGQfdxR5VzZWh4iodGQfhli6fnce_=" 
          href=" 

我想只之間的串「和」僅此:

-iUzEhgdscgbpj5VMi5zoh54FTeFt8M4mj5nsiodxR5VzZOhniodpj6nFQg0nce3MhUxFSgdxjM4J 
    jUVzZuNu8o0sREnFSUzISUXzZWh4iodGQfdxR5VzZWh4iodGQfhli6fnce_= 

但我得到我的代碼這是我想要的這個很長的字符串,還有文件的其餘部分。

+4

[HtmlAgilityPack(http://htmlagilitypack.codeplex.com/) –

+2

爲什麼這個標記*的WinForms *? –

+0

@ O.R.Mapper你從來沒有在winforms中分析html內容? –

回答

0

工作實例http://ideone.com/U224iZ

string start = "data-token="; 
    string end = " href"; 

    string source = "<a class='bizLink' data-token='-iUzEhgdscgbpj5VMi5zoh54FTeFt8M4mj5nsiodxR5VzZOhniodpj6nFQg0nce3MhUxFSgdxjM4JjUVzZuNu8o0sREnFSUzISUXzZWh4iodGQfdxR5VzZWh4iodGQfhli6fnce_=1\" href='"; 

    int firstTag = source.IndexOf(start); 
    int lastTag = source.IndexOf(end, firstTag); 
    int startIndex = firstTag + start.Length +1; 
    int endIndex = lastTag; 
    string authenticityToken = source.Substring(startIndex, endIndex - startIndex -1); 
    Console.Write(authenticityToken); 
    Console.ReadLine(); 
4

理智的方法是使用HTML解析器和查詢庫。我可以建議CsQuery,這是一個類似於jQuery的.NET庫。您可以使用像a[data-token]這樣的選擇器來匹配您的錨點,然後提取屬性值。

這是做事的正確方法。


但是如果你只有史以來想要得到這一個屬性,不要再礙着與HTML源任何東西,它可能更容易只是使用正則表達式,但要注意:parsing HTML with regex is evil

所以,如果你想要做的就是提取此一條信息,作爲一項例外措施,爲您的信息,你可以使用:

var m = Regex.Match(source, @"data-token\s*=\s*""(?<token>.+?)"""); 
var authenticityToken = m.Groups["token"].Value; 

但第一次嘗試CsQuery。這是一個很多更好的方法。

+0

我同意,只是認爲正則表達式模式可以更簡單:「data-token = \」([^ \「] +)」「 –

+0

雖然這是真的,我選擇了一個更正確的模式(html允許空格圍繞'='符號)。此外,我喜歡使用命名捕獲,它使得正則表達式更容易讀取IMO。 –

+0

點採取。btw,喜歡關於HTML和正則表達式的鏈接:-) –

相關問題