【问题标题】:Parsing URL string to remove unwanted stuff (C++)解析 URL 字符串以删除不需要的东西 (C++)
【发布时间】:2010-09-15 21:15:26
【问题描述】:

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

给定一个这种形式的 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;
}

但它很丑陋,并且会导致几个测试用例失败。我知道有人有更聪明的方法来做到这一点。有人吗?

【问题讨论】:

    标签: c++ string


    【解决方案1】:

    您的解决方案最大的概念问题是假设它们给定的键不会出现在 URL 的查询部分的其他任何地方,无论是作为值的一部分还是作为另一个键的一部分。换句话说,给定输入http://www.example.com?keystone=value1&amp;key=value2,查找key 会意外删除keystone=value1。或者给定输入http://www.example.com?key1=key2&amp;key2=value2,寻找key2 将返回http://www.example.com?key1=&amp;key2=value2,这又不是你想要的。

    假设您不能/不想为此使用正则表达式库,您可以做出的最佳改进是提取每个键的全部内容(通过提取 ?&amp; 和随后的=),直到其中一个与您要查找的密钥匹配,然后像以前一样删除。

    根据问题中的假设,您可能需要考虑如何解析 URL 编码字符(例如,查找“多字键”应匹配 multi%20word%20key)。

    【讨论】:

    • D'OH!是的。我知道我的解决方案很糟糕。
    【解决方案2】:

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

    【讨论】:

    • 使用正则表达式将是我的第一种方法,无论是在实际代码中还是在面试中。如果这在某种程度上是不可接受的,我会按照 Tyler 的建议处理字符串。
    【解决方案3】:

    听起来像是在乞求正则表达式。在 Perl 中会是这样的

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

    即匹配“?”之前的内容它介绍了参数,在你的键之前匹配参数,有键(它必须在“?”或“&”和“=”之间,所以你不能在字符串的另一部分得到部分匹配)和它的参数,然后匹配后面的内容(如果有的话)。

    我认为您可以相当直接地将这些正则表达式翻译成 .NET,但我是在 vi 和 Perl 中学习它们的,所以这就是我开始的地方。

    【讨论】:

    • @Jagannath -- 确实如此!您仍然可以找到适用于 C++ 的正则表达式解析器 - 如果有更多类似的情况需要处理,您的努力将是合理的。
    猜你喜欢
    • 1970-01-01
    • 2016-06-29
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    相关资源
    最近更新 更多