2

私は次のシナリオを得ました:

アフィリエイト ネットワークの URL を取得し、追跡目的で適切な URL パラメータ (サブ ID) を追加する必要があります。

実際の問題: 1 つのアフィリエイト ネットワークでさえ、異なるクエリ文字列形式をサポートしている場合があります。例:

1) http:/ /impde.sampleaffiliate.com/imp?pop(over)g(XXXXX)a(XXX)subid(subIdValue)

また

2) http:/ /clkde.sampleaffiliate.com/click?p=XXX&a=XXX&g=XXX&subid=subIdValue

アフィリエイト ネットワークの認識は非常に単純です[url.Contains("sampleaffiliate")]が、クエリ文字列の形式を取得するために、正規表現を使用しています。

//query string parameter values are in brackets, e.g. ?a(12312)b(12343432)c(4242)
Regex parametersInBrackets = new Regex(@"^[\?]{1}\w+(\(.*\))+$");
//query string parameter values are separated by ampersands and equal signs, e.g. ?a=12312&b=12343432&c=4242
Regex parametersWithAmpersand = new Regex(@"^[\?]{1}.+(\&\w+\=.+)+$");

それらは「通常のケース」ではうまく機能します。

しかし、次の URL を見てください。

http:/ /pdt.sampleaffiliate.com/click?a(AAA)p(BBB)prod(CCC)ttid(DDD)url(http:/ /www.example.com/item.asp?param1=EEE&param2=FFF&param3=GGG)

この場合、彼らname(value)name(value)はクエリ文字列で表記法を使用しますが、最後のパラメーター ("url") の値として、&name=value&name=value表記法に別の URL があるため、正規表現が両方のどちらであるかを確認するのが非常に難しくなります。それは使用されるはずです...

私の現在の正規表現は両方とも、最後の例の IsMatch(uri.Query) で「true」を返します。

これを修正する方法はありますか?

前もって感謝します!

4

2 に答える 2

2

パラメータと値を返すクラスの静的ParseQueryString()メソッドを使用できます。System.Web.HttpUtilityNameValueCollection

Uri myUri = new Uri("http://clkde.sampleaffiliate.com/click?p=XXX&a=XXX&g=XXX&subid=subIdValue");
string param1 = HttpUtility.ParseQueryString(myUri.Query).Get("p");

http://msdn.microsoft.com/en-us/library/ms150046.aspxでドキュメントを確認してください

于 2013-05-18T17:51:38.807 に答える