2013-05-18 2 views
2

я получил следующий сценарий: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&param2=FFF&param3=GGG) 

В этом случае они используют name(value)name(value) обозначения в строке запроса, но в качестве значения для последнего параметра («URL»), есть еще один URL-адрес в нотации &name=value&name=value, что делает его действительно трудным для регулярного выражения, которое из того, которое предполагается использовать ...

Мои текущие регулярные выражения возвращают «истину» на IsMatch (uri.Query) для последнего примера.

Любые идеи, как исправить это?

Заранее благодарен!

+0

Пробовал ли вы разбирать строку URL, используя класс Uri в структуре .net, где у вас может быть querystring как свойство для работы. Подробнее здесь: http://msdn.microsoft.com/en-us/library/system.uri.aspx – Saravanan

+1

@saravanan Да, я бы хотел использовать 'ParseQueryString()', но, к сожалению, похоже, что он способен разбора символов амперсанда (& name = value & name = value), но не пользовательских, таких как нотация скобок (имя (значение) name (value)). Или это возможно хоть как-то? –

ответ

2

«трудного связи» вы получаете не правильно кодировке URL, так что я подозреваю, что встроенный в ParseQueryString, вероятно, не будет работать (и я полагаю, что это, к сожалению, из ваш контроль).

Вы можете использовать следующую Regex чтобы разобрать его на части:

^[\?]{1}(\w+\([^\)]+\))+$ 

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

Используйте этот Regex первым; если он возвращает, это совпадение. Если это не удается, используйте конструкцию в ParseQueryString.

2

Вы можете использовать статический метод ParseQueryString() класса System.Web.HttpUtility, который возвращает NameValueCollection для параметра &.

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

+1

Да, я хотел бы использовать 'ParseQueryString()', но, к сожалению, похоже, что он способен обрабатывать только символы ampersand (& name = value & name = value), а не пользовательские, такие как нотация скобок (имя (значение) стоимость)). Или это возможно хоть как-то? –

+0

вам нужно написать синтаксический анализатор, он не будет сложным, просто потратив немного времени! –

Смежные вопросы