给梦一个奔跑的方向!
PDF Print E-mail
User Rating: / 0
PoorBest 
Written by xlingfairy
Friday, 06 November 2009 13:53
 default.aspx?a[]=1&a[]=2&b[0]=1&b[2]=2&c=3&c=4&d[a]=1&d[b]=2&A[]=3,4&e[0]=1&e[1]=2&a=4
 
Request.QueryString["a"] = 4
Request.QueryString["a[0]"] = null
Request.QueryString["a[]"] = "1,2,3,4"
 
Request.QueryString["b[]"] = null
Request.QueryString["b[0]"] = 1
Request.QueryString["c"] = "3,4"
 
Request.QueryString["d"] = null
Request.QueryString["d[a]"] = 1
 
Request.QueryString["e"] = null
Request.QueryString["e[0]"] = 1
 
由上可见:
1, .NET  的 queryString 的 参数名是可以包括中号的。但是PHP的不能,PHP里把带中括号的参数都转换成数组了,同名的就会放到同一个数组里。
2, .NET在处理 queryString 的时候,不区分大小写,如 a[] 和 A[] 的值是放到一起的。
3, 同名的参数,包括  带中括号且中括号里内容相同的 ,都会放到一起,用逗号分开。如 a[], c. 反之如 b 和 d, e.
如果 &e[1]=2&a=4&e[1]=2 则 Request.QueryString["e[1]"] = "2,2"
 
 
test.php?a[]=1&a[]=2&b[0]=1&b[2]=2&c=3&c=4&d[a]=1&d[b]=2&A[]=3,4&e[0]=1&e[1]=2&e=3
 
array (
  'a' => 
  array (
    0 => '1',
    1 => '2',
  ),
  'b' => 
  array (
    0 => '1',
    2 => '2',
  ),
  'c' => '4',
  'd' => 
  array (
    'a' => '1',
    'b' => '2',
  ),
  'A' => 
  array (
    0 => '3,4',
  ),
  'e' => '3',
)
 
由上可见:
1,php的queryString 的参数如果带中括号,都被放到数组里了,如果数组同名,就放到同一个数组里。数组的下标就是中括号里的内容。
2,php  的 querystring 是区分大小写的。如 a 和 A
3, 同名的,但是不带中括号的,取最后一个出现的值。如 c 和 e
4, e[0]=1&e[1]=2&e=3 最后取得的 e = 3 是因为,'e' => array(0=>'1',1=>'2') 和 'e' => '3'  同名,所以,取最后一个出现的值,即3
 
 
针对上面对.NET的分析,可以写个类似PHP里的 parse_str 的函数:
 
        public static string ParseString(this string s, string key , bool ignoreCase) {
            Dictionary<string, string> kvs = s.ParseString( ignoreCase );
            if (kvs.ContainsKey(key)) {
                return kvs[key];
            }
            return "";
        }
 
        public static Dictionary<string, string> ParseString(this string s, bool ignoreCase) {
 
            if (s.IndexOf('?') != -1) {
                s = s.Remove(0, s.IndexOf('?'));
            }
 
            Dictionary<string, string> kvs = new Dictionary<string, string>();
            Regex reg = new Regex(@"[\?&]?(?<key>[^=]+)=(?<value>[^\&]*)", RegexOptions.Compiled | RegexOptions.Multiline);
            MatchCollection ms = reg.Matches(s);
            string key;
            foreach (Match ma in ms) {
                key = ignoreCase ?  ma.Groups["key"].Value.ToLower() : ma.Groups["key"].Value;
                if (kvs.ContainsKey(key)) {
                    kvs[key] += "," + ma.Groups["value"].Value;
                } else {
                    kvs[key] = ma.Groups["value"].Value;
                }
            }
 
            return kvs;
        }
    }
 
    string str = "http://butcher/blog/test.php?a[]=1&a[]=2&b[0]=1&b[2]=2&c=3&c=4&d[a]=1&d[b]=2&A[]=3,4&e[0]=1&e[1]=2&e=3&a=4&e[1]=2";
    Dictionary<string,string> kvs = str.ParseString(true);
 
不知道.NET里有没有原生的函数可以做类型的事情。。。
 

Add comment


Security code
Refresh

Popular Contents

Recommend

Site Info

Members : 1
Content : 130
Web Links : 7
Content View Hits : 99631

Links