解析URL字符串以删除不需要的东西(C ++)

时间:2010-09-15 21:15:27

标签: c++ string

在接受采访时被问到这个问题,我的解决方案有点糟糕,所以我想知道是否有人能做得更好。

给定此格式的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;
}

但它很难看,它会在几个测试用例中失败。我知道有人有更聪明的方法来做到这一点。任何人吗?

3 个答案:

答案 0 :(得分:2)

您的解决方案最大的概念问题是它假设它们的键不会出现在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,这也不是您想要的。

假设你不能/不想为此使用正则表达式库,你可以做的最好的改进是提取每个键的全部内容(通过提取?或{{之间的所有内容1}}和随后的&),直到其中一个匹配您要查找的密钥,然后像以前一样删除。

根据问题中的假设,您可能需要考虑如何解析URL编码的字符(例如,查找“多字密钥”应该匹配=)。

答案 1 :(得分:1)

我当然会尝试使用 std :: tr1 :: regex (TR1标准正则表达式库,在std :: regex中,如果你在最近的编译器中有一个C ++ 0x实现) ,但是我想在正则表达式语法上花费太多时间。

答案 2 :(得分:0)

听起来像是在寻找正则表达式。在Perl中,它将类似于

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

即。匹配“?”之前的东西它引入了参数,匹配键前面的参数,键是(必须在“?”或“&amp;”和“=”之间,因此你不能在字符串的另一部分得到部分匹配)及其参数然后匹配它后面的内容(如果有的话)。

我认为你可以直接将这些正则表达式转换成.NET,但我在vi和Perl中学习它们,这就是我从哪里开始的。