я получил следующий сценарий:C# регулярные выражения для URL строки запроса
Я получаю партнерскую сеть URL и необходимо добавить соответствующий параметр URL для отслеживания целей (Subid).
Актуальная проблема: в некоторых случаях даже одна партнерская сеть поддерживает различные форматы строк запроса. Пример:
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+\=.+)+$");
Они отлично работают для «нормальных случаев».
Но тут приходит дополнительные трудности - смотрите по следующему адресу:
http:/ /pdt.sampleaffiliate.com/click?a(AAA)p(BBB)prod(CCC)ttid(DDD)url(http:/ /www.example.com/item.asp?param1=EEE¶m2=FFF¶m3=GGG)
В этом случае они используют name(value)name(value)
обозначения в строке запроса, но в качестве значения для последнего параметра («URL»), есть еще один URL-адрес в нотации &name=value&name=value
, что делает его действительно трудным для регулярного выражения, которое из того, которое предполагается использовать ...
Мои текущие регулярные выражения возвращают «истину» на IsMatch (uri.Query) для последнего примера.
Любые идеи, как исправить это?
Заранее благодарен!
Пробовал ли вы разбирать строку URL, используя класс Uri в структуре .net, где у вас может быть querystring как свойство для работы. Подробнее здесь: http://msdn.microsoft.com/en-us/library/system.uri.aspx – Saravanan
@saravanan Да, я бы хотел использовать 'ParseQueryString()', но, к сожалению, похоже, что он способен разбора символов амперсанда (& name = value & name = value), но не пользовательских, таких как нотация скобок (имя (значение) name (value)). Или это возможно хоть как-то? –