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里有没有原生的函数可以做类型的事情。。。
| < Prev | Next > |
|---|



