更清晰的方法来分割没有HttpUtility的查询字符串

时间:2016-04-12 20:16:27

标签: c# parsing lambda xamarin split

我有一个Xamarin应用程序,用于解析包含查询字符串的扫描QR码。有时,用户会扫描无法拆分为字典的其他代码。我根据我发现的一些例子写了以下内容,但它看起来有点难看:

var parts = query.Split(new[] { '&' });

try
{
    return parts.Select (
            part => part.Split (new [] { '=' }))
                        .ToDictionary(
                           pair => { try { return pair [0]; } catch { return string.Empty; } }, 
                           pair => { try { return pair [1]; } catch { return string.Empty; } }
                        );
}
catch 
{ 
    return null; // eat
}

有没有更好的方法来解决这个问题?

2 个答案:

答案 0 :(得分:0)

我想正则表达式就是你要找的东西。它解决了验证问题并避免了第一次拆分和选择

string validUrl = "http://www.contoso.com/data?foo=bar&bar=foo";                

foreach (Match match in Regex.Matches(validUrl, @"(\?|\&)([^=]+)\=([^&]+)"))
{
    Console.WriteLine(match.Value.TrimStart('&','?'));
}

答案 1 :(得分:0)

对您从QR代码扫描程序接收的网址进行预验证。这将允许您摆脱使用空捕获吞咽异常所做的黑客攻击。

    public IDictionary<string, string> GetParams(string query)
    {
        // Perform a validation if URL is valid
        var regex = @"^http(s)?://([\w-]+.)+[\w-]+(/[\w- ./?%&=])?$";
        Regex validator = new Regex(regex, RegexOptions.Compiled);
        if (!validator.IsMatch(query))
        {
            return null;
            // or
            // throw new ArgumentException("Invalid Url");
        }

        var parts = query.Split('?')[1].Split('&');

        return parts.Select(part => part.Split(new[] { "=" }, 2, StringSplitOptions.RemoveEmptyEntries))
                .ToDictionary(
                pair =>
                {
                    return pair[0];
                },
                pair =>
                {
                    return pair[1];
                }
            );
    }

将查询字符串解析为字典比使用正则表达式进行解析更方便。