C# 如何在WP7中分解URI?

C# 如何在WP7中分解URI?,c#,silverlight,windows-phone-7,query-string,C#,Silverlight,Windows Phone 7,Query String,是否有一种方法可以访问WebBrowser控件中的查询参数,还是必须手动拆分字符串?例如: http://www.mysite.com?paramter=12345 我只需要访问参数的值。我知道在使用xaml页面时,我们有QueryString属性。处理网页有类似的方法吗?除非其他人有其他方法,否则我可以手动完成同样的事情: // The url looked something like this http://www.mysite.com?param1=value&param2=v

是否有一种方法可以访问WebBrowser控件中的查询参数,还是必须手动拆分字符串?例如:

http://www.mysite.com?paramter=12345

我只需要访问参数的值。我知道在使用xaml页面时,我们有QueryString属性。处理网页有类似的方法吗?

除非其他人有其他方法,否则我可以手动完成同样的事情:

// The url looked something like this http://www.mysite.com?param1=value&param2=value
var parameterValue = e.Uri.Query.Split('&')
            .Where(s => s.Split('=')[0] == "param2")
            .Select(s => s.Split('=')[1])
            .FirstOrDefault();

我不认为这种方式不好,我只是想知道是否有一种内置的方法用于这种类型的解析,因为我知道它存在于ASP.NET、.NET等中。

我不记得从哪里得到的,可能是这样

 public static class UriExtensions
    {
        private static readonly Regex QueryStringRegex = new Regex(@"[\?&](?<name>[^&=]+)=(?<value>[^&=]+)");

        public static IEnumerable<KeyValuePair<string, string>> ParseQueryString(this Uri uri)
        {
            if (uri == null)
                throw new ArgumentException("uri");

            var matches = QueryStringRegex.Matches(uri.OriginalString);
            for (var i = 0; i < matches.Count; i++)
            {
                var match = matches[i];
                yield return new KeyValuePair<string, string>(match.Groups["name"].Value, match.Groups["value"].Value);
            }
        }
    }
公共静态类扩展
{
私有静态只读正则表达式QueryStringRegex=新正则表达式(@“[\?&](?[^&=]+)=(?[^&=]+)=(?[^&=]+)”;
公共静态IEnumerable ParseQueryString(此Uri)
{
if(uri==null)
抛出新的ArgumentException(“uri”);
var matches=QueryStringRegex.matches(uri.OriginalString);
for(var i=0;i
灵感来源于

公共静态字典ParseQueryString(Uri)
{
var substring=uri.Query;
如果(substring.Length>0)
子串。子串(1);
变量对=子字符串.拆分('&');
var输出=新字典(pairs.Length);
foreach(成对的弦乐片)
{
变量对=工件分割('=');
输出。添加(
Uri.UnescapeDataString(对[0]),
UnescapeDataString(对[1]);
}
返回输出;
}

其他答案中的一些重要优化:

  • 在Uri中处理a#
  • 处理Uri中可能缺少的值,如&name=
  • 不要忘记
    Uri.UnescapeDataString
  • 返回
    字典
    而不是
    IEnumerable
    ,以便轻松找到所需参数
  • 解释
    Uri.Query
    在WP7上不可靠
  • 比较最佳解决方案的速度
使用正则表达式(比Split慢):


这在Windows Phone中似乎也有QueryContext属性。@SandepsingRawat是的,我看到了,但如果您注意到这是针对XAML页面和它们之间的导航的。我实际上需要一个浏览器控件中网页的解决方案。如果你的网页是asp.net网页,那么你可以使用HttpRequest.QueryString,但你可能已经知道了。对于静态页面,您可能会使用一些jquery扩展。即使是自定义解析似乎也不是一个坏主意,如果没有其他可用的东西。啊,看起来自定义解析是唯一的解决方案。还是有点奇怪,没有一种方法可以解决这类问题。@loyalpenguin仍然是定制的,但至少有一种扩展方法。对我来说非常有效。谢谢我认为它应该返回新的KeyValuePair(HttpUtility.UrlDecode(match.Groups[“name”].Value),HttpUtility.UrlDecode(match.Groups[“Value”].Value))
IEnumerable
不允许您检查特定密钥。您至少需要一个
i集合
i词典
public static Dictionary<string, string> ParseQueryString(Uri uri)
{
    var substring = uri.Query;
    if (substring.Length > 0)
         substring.Substring(1);

    var pairs = substring.Split('&'); 
    var output = new Dictionary<string, string>(pairs.Length);

    foreach (string piece in pairs)
    {
        var pair = piece.Split('=');
        output.Add(
            Uri.UnescapeDataString(pair[0]),
            Uri.UnescapeDataString(pair[1]));
    }

    return output;
}
static readonly Regex QueryStringRegex1 = new Regex(@"^[^#]*\?([^#]*)");
static readonly Regex QueryStringRegex2 = new Regex(@"(?<name>[^&=]+)=(?<value>[^&=]*)");
public static Dictionary<string, string> QueryDictionary(this Uri uri)
{
    return QueryStringRegex1.Match(uri.ToString())// between ? and #
        .Groups
        .Cast<Group>()
        .Select(a => QueryStringRegex2.Matches(a.Value)// between ? and &
            .Cast<Match>()
            .Select(b => b.Groups)
            .ToDictionary(b => Uri.UnescapeDataString(b["name"].Value), b => Uri.UnescapeDataString(b["value"].Value)))
        .ElementAtOrDefault(1)
        ?? new Dictionary<string, string>();
}
static readonly char[] QueryStringSeparator1 = "#".ToCharArray();
static readonly char[] QueryStringSeparator2 = "?".ToCharArray();
static readonly char[] QueryStringSeparator3 = "&".ToCharArray();
static readonly char[] QueryStringSeparator4 = "=".ToCharArray();
public static Dictionary<string, string> QueryDictionary(this Uri uri)
{
    return uri.ToString()
        .Split(QueryStringSeparator1, StringSplitOptions.RemoveEmptyEntries)
        .Select(a => a.Split(QueryStringSeparator2, StringSplitOptions.RemoveEmptyEntries)
            .Select(b => b.Split(QueryStringSeparator3, StringSplitOptions.RemoveEmptyEntries)
                .Select(c => c.Split(QueryStringSeparator4))
                .Where(c => c[0].Length > 0)
                .ToDictionary(c => Uri.UnescapeDataString(c[0]), c => c.Length > 1 ? Uri.UnescapeDataString(c[1]) : ""))
            .ElementAtOrDefault(1))// after ?
        .FirstOrDefault()// before #
        ?? new Dictionary<string, string>();
}
public static readonly bool IsVersion8 = Environment.OSVersion.Version >= new Version(8, 0);