preg_match:等号模式

时间:2011-02-19 22:58:20

标签: php jquery regex serialization

我有这个问题:

list[One]=1&list[Two]=2&list[Apple]=fruit


这是我用来返回括号中的值和等号

之后的正则表达式
preg_match_all('/(?<query>list\[(?<pagename>.*?)\]\=(?<parent>.*?))/',$source,$array);


返回:

One=  
Two=  
Apple= 


缺少等号后面的值。哪里是我的错?

顺便说一下,这个查询是用jquery的serialize()生成的。有没有更好的方法来解析值?

3 个答案:

答案 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;
}