2012-06-16 89 views
1

我試圖爲c#創建一個解析系統,以阻止我的程序從位於列表中的「禁止」網站獲取圖像。我曾嘗試使用bool類來執行Regex.Replace操作,但不幸的是它沒有解決。包含在列表中的C#字符串解析

要詳細說明究竟我想什麼,這是一個例子: 我有一個List BannedSites =新列表{「網站」};

if(Bannedsites.Contains(input)) 
{ 
    Don't go to that site 
} 
else 
{ 
    Go to that site 
} 

雖然錯誤我大多得到的是我有「的網站」列表中,但如果有人做「現場」用空格之後它轉到else語句,因爲它不直接在存在名單,或者如果有人做「網站?」而且我們知道url結尾處的問號通常不會影響訪問該網站,所以他們再次繞過它。如果輸入包含「站點」,使用字符串,它可能會執行一些操作,因爲它不會進入站點。對不起,如果這是一個簡單的代碼,但我一直無法弄清楚,谷歌沒有幫助。

在此先感謝!

回答

5

您可以使用LINQ的.Any幫助是:

if(Bannedsites.Any(x => input.Contains(x)) { 
    // Don't go to that site 
} else { 
    // Go to that site 
} 

記住使用.ToUpperInvariant()的一切,使其不區分大小寫。

+0

它的工作,非常感謝你! – Nom

+2

提防誤報,例如「wokersexchange」包含「sexchange」 – Theraot

+0

@Theraot:或者用連字符的網站。預連字符。 – Ryan

2

如果您確定只有域名Bannedsites中的域名(可以說是ips),那麼您只能查找域名。

爲了得到一個URI的域,請執行以下操作:

var uri = new Uri("http://stackoverflow.com/questions/11060418/c-sharp-string-parsing-containing-in-a-list"); 
Console.WriteLine(uri.DnsSafeHost); 

輸出是:

stackoverflow.com 

現在,你可以得到它這樣的工作(記得在大寫存儲在Bannedsites):

var uri = new Uri(input) 
if(Bannedsites.Contains(uri.DnsSafeHost.ToUpper(CultureInfo.InvariantCulture))) 
{ 
    //Don't go to that site 
} 
else 
{ 
    //Go to that site 
} 

這也將確保域不是偶然出現的另一個字符串的一部分,例如作爲參數的一部分。

另外請注意,這種方法會給你的子域,那麼:

var uri = new Uri("http://msdn.microsoft.com/en-US/"); 
Console.WriteLine(uri.DnsSafeHost); 

回報:

msdn.microsoft.com 

不僅:

microsoft.com 

您也可以驗證該URI與有效:最後,如果你是禁止

var uri = new Uri(input) 
if(uri.IsWellFormedOriginalString() && Bannedsites.Any(x => uri.DnsSafeHost.EndsWith(x)) 
{ 
    // Don't go to that site 
} 
else 
{ 
    // Go to that site 
} 

var uri = new Uri(input) 
if(uri.IsWellFormedOriginalString() && Bannedsites.Contains(uri.DnsSafeHost)) 
{ 
    //Don't go to that site 
} 
else 
{ 
    //Go to that site 
} 

現在,讓我們說,你要考慮到子域的細節,好了,你可以這樣做特定頁面而不是整個網(在這種情況下照顧子域是沒有意義的),那麼你可以做如下:

var uri = new Uri(input) 
if(uri.IsWellFormedOriginalString() && Bannedsites.Contains((uri.DnsSafeHost + uri.AbsolutePath))) 
{ 
    //Don't go to that site 
} 
else 
{ 
    //Go to that site 
} 

使用AbsolutePath你照顧那些「?」和「#」通常用於傳遞參數,以及其他任何不改變請求頁面的字符。


你也可以考慮使用Uri.Compare並存儲Uri列表而不是字符串列表。


我離開你作出比較時不變爲RFC 1035的任務說: 「 對於那些正式協議的一部分的DNS的所有部分,字符串(例如,標籤之間的所有 比較,域名等) 在不區分大小寫的方式進行。 「