使用正则表达式捕获重复的组

时间:2014-09-15 16:46:23

标签: php regex preg-match

我正在尝试构建以逗号分隔的项目列表。这些项由嵌入在表达式中的引号中的内容组成,类似于以下两个示例。

列表来自一个会话文件,包含一个起始文本标识符,后跟一个或s表示数组/字符串,一个数字表示数组中有多少项(如果没有数组则为0) - 这里是一对示例:

extralistids|a:3:{i:0;s:3:"id1";i:1;s:4:" id2";i:2;s:4:" id3";}
extralistids|s:0:"";

我有以下preg_match表达式,但它只捕获“id3” - 任何想法我做错了什么?

/extralistids.+?(?:{).*?("(.*?)"(?:.*?))+;(?:})/

1 个答案:

答案 0 :(得分:0)

如果您想在模式中使用字符串extralistids,请尝试以下正则表达式。

(?:\bextralistids\||(?<!^)\G)[^"]*\"([^"\n]*)"

DEMO

<?php
$mystring =<<<EOT
extralistids|a:3:{i:0;s:3:"id1";i:1;s:4:" id2";i:2;s:4:" id3";}
extralistids|s:0:""
EOT;
$regex = '~(?:\bextralistids\||(?<!^)\G)[^"]*\"([^"\n]*)"~';
preg_match_all($regex, $mystring, $matches);
print_r($matches[1]);
?>

输出:

Array
(
    [0] => id1
    [1] =>  id2
    [2] =>  id3
    [3] => 
)