Разбор строки URL для удаления ненужных вещей (C ++) - PullRequest
0 голосов
/ 16 сентября 2010

Меня спросили об этом в одном интервью, мое решение вроде как засосало, поэтому мне интересно, может ли кто-нибудь добиться большего успеха.

Учитывая строку URL в этой форме:

http://www.foo.com? Key1 = value1 & key2 = value2 & key3 = value3 и дан ключ

Я хочу создать функцию, которая принимает значение ключа и возвращает исходную строку БЕЗ ключа и значения.

Пример:

ввод:

http://www.foo.com?key1=value1&key2=value2&key3=value3   
remove: key2 and its value

выход:

http://www.foo.com?key1=value1&key3=value3

Мое решение было примерно таким:

void parseURL(string str, string key)
{
    int i;
    i = str.find_first_of("?"); 

    string s = str.substr(i); 
    int start = s.find(key);
    int end = 0;
    if (start !=string::npos) 
        end = s.find_first_of("&", start); 

    string news = str.substr(0, i) + s.substr(0, start-1) + s.substr(end); 

    cout << news;
}

Но это некрасиво и провалит пару тестов. Я знаю, у кого-то есть более умный способ сделать это. Кто-нибудь? * * 1023

Ответы [ 3 ]

2 голосов
/ 16 сентября 2010

Самая большая концептуальная проблема вашего решения состоит в том, что предполагается, что данный ключ не встречается нигде в части запроса URL-адреса, ни как часть значения, ни как часть другого ключа.Другими словами, при вводе http://www.example.com?keystone=value1&key=value2 при поиске key случайное удаление keystone=value1.Или с учетом ввода http://www.example.com?key1=key2&key2=value2, поиск key2 вернет http://www.example.com?key1=&key2=value2, что опять-таки не то, что вы хотите.

Предполагая, что вы не можете / не хотите использовать библиотеку регулярных выражений для этогосамое лучшее улучшение, которое вы можете сделать, это извлечь весь ключ (извлекая все между ? или & и последующими =), пока один из них не совпадет с ключом, который вы ищете, а затемудалите, как и раньше.

И, в зависимости от сделанных в вопросе предположений, вы можете подумать, как можно проанализировать символы, закодированные в URL (например, поиск «многословного ключа» должен соответствовать multi%20word%20key).

1 голос
/ 16 сентября 2010

Я бы, конечно, попытался использовать std :: tr1 :: regex (стандартная библиотека TR1 для регулярных выражений, в std :: regex, если в вашем недавнем компиляторе есть реализация C ++ 0x)но я бы взял слишком много времени на синтаксис регулярных выражений, я думаю.

0 голосов
/ 16 сентября 2010

Звучит так, будто он просит регулярных выражений.В Perl это было бы что-то вроде

$url =~ s/^((.*)\?(.*))[\?&]$key=[^&]*&?(.*)$/$1$4

, то есть совпадение с материалом перед "?"который вводит параметры, параметры сопоставления, предшествующие вашему ключу, есть ключ (который должен быть между "?" или "&" и "=", чтобы вы не могли получить частичные совпадения в другой части строки) и его параметр,затем сопоставьте то, что (если что-нибудь) последует за ним.

Вы можете довольно просто перевести эти регулярные выражения в .NET, я думаю, но я выучил их в vi и в Perl, так что с этого я и начинаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...