1

リストにある「禁止された」Webサイトからプログラムが画像をフェッチするのをブロックするために、c#の解析システムを作成しようとしています。boolクラスを使用してRegex.Replace操作を実行しようとしましたが、残念ながらうまくいきませんでした。

私が正確に何を望んでいるかを詳しく説明するために、これは例です。リストBannedSites = new List {"site"};

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

私が主に得るエラーは、リストに「site」があることですが、誰かが後でスペースを使用して「site」を実行すると、リストに直接存在しないため、elseステートメントに移動します。または、誰かが「サイト?" また、URLの最後にある疑問符は、通常はサイトにアクセスするのに違いがないことを知っているので、彼らは再びそれをバイパスします。入力に「site」が含まれている場合、文字列を使用して、サイトに移動しないようにすることは可能ですか。これが単純なコードである場合は申し訳ありませんが、私はそれを理解することができず、グーグルは助けにはなりませんでした。

前もって感謝します!

4

2 に答える 2

5

LINQを使用.Anyしてそれを支援できます。

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

.ToUpperInvariant()大文字と小文字を区別しないように、すべてに使用することを忘れないでください。

于 2012-06-16T03:00:07.887 に答える
2

リストにドメイン名 (およびほぼ間違いなく ips) しかないことを確認した場合はBannedsites、ドメインのみを探すことができます。

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 が有効であることを確認することもできますuri.IsWellFormedOriginalString()

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.Any(x => uri.DnsSafeHost.EndsWith(x))
{
    // Don't go to that site
}
else
{
    // Go to that site
}

最後に、Web 全体ではなく特定のページを禁止する場合 (この場合、サブドメインを気にしても意味がありません)、次のようにできます。

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が言うように、大文字と小文字を区別しない比較を行う作業はあなたに任せます。大文字と小文字を区別しない方法。」

于 2012-06-16T03:39:43.380 に答える