我有这个问题:
list[One]=1&list[Two]=2&list[Apple]=fruit
这是我用来返回括号中的值和等号
preg_match_all('/(?<query>list\[(?<pagename>.*?)\]\=(?<parent>.*?))/',$source,$array);
返回:
One=
Two=
Apple=
缺少等号后面的值。哪里是我的错?
顺便说一下,这个查询是用jquery的serialize()生成的。有没有更好的方法来解析值?
答案 0 :(得分:3)
正如我在评论中所做的那样,您可能希望查看parse_str
但是,如果您将最终的.*?
更改为[^&]*
之类的内容,那么您可能会有更好的运气(假设这是一个GET查询字符串(或某些传真),因为&
必须使用%26
)
答案 1 :(得分:1)
(?<parent>.*?)
匹配一个空字符串,因此结果是'正确'。请尝试(?<parent>[^&]+)
:
preg_match_all('/(?<query>list\[(?<pagename>.*?)\]\=(?<parent>[^&]+))/',$source,$array);
答案 2 :(得分:1)
因为你对?
使用了非贪婪的<parent>
,所以它并没有抓住这些值。尝试其他答案,或者如果您可以依赖格式list[<name>]=<value>
,那么您可以完全避免使用正则表达式。
$query = 'list[One]=1&list[Two]=2&list[Apple]=fruit';
$pieces = explode('&', $query);
$matches = array();
foreach ($pieces as $piece) {
list($key, $value) = explode('=', $piece);
$matches[substr($key, 5, -1)] = $value;
}