正则表达式 - 从重复格式中提取字符串

时间:2014-10-07 15:59:36

标签: php regex

编辑 - 已解决:
感谢您的回复 - 我了解到这实际上是序列化格式,并且无需使用RegEx处理它。

为新问题道歉 - 我尝试了很多变种,基于StackOverflow的答案,没有运气。我还花了一段时间尝试使用在线Regex工具尝试自己解决这个问题。

这是我正在检查的字符串:

i:0;s:1:"1";i:1;s:1:"3";i:2;s:1:"5";i:3;s:1:"6";

我会满足于匹配这些字符串:

i:0;s:1:"1";
i:1;s:1:"3";
i:2;s:1:"5";
i:3;s:1:"6";

但理想情况下,我只想在引号之间捕获所有值 (这些条目中可能有1-10个之间的任何地方)
即regex_result = [1,3,5,6]

这些是我试过的一些正则表达式。 我只能抓住第一场比赛,或者最后一场比赛,但不是所有的比赛 - 我很困惑为什么正则表达式不是"重复"正如我所料:

(i:.;s:1:".";)*

(i:.;s:1:".";)+

(i:.;s:1:".";)+?

由于

3 个答案:

答案 0 :(得分:0)

您可以使用此正则表达式。

/(?<=:")\d+(?=";)/g

DEMO

答案 1 :(得分:0)

"([^"]*)"

试试这个。参见演示。

http://regex101.com/r/hQ1rP0/43

答案 2 :(得分:0)

您需要使用\G,这样才能获得双引号内的数字,前面是i:.;s:1:"此处i:后面的点代表任何字符)。 anchor \ G匹配上一场比赛结束的位置。

<?php
$string = 'i:0;s:1:"1";i:1;s:1:"3";i:2;s:1:"5";i:3;s:1:"6";';
echo preg_match_all('~(?:i:.;s:1:"|(?<!^)\G)(.)(?=";)~', $string, $match);
print_r($match[1]);
?>

输出:

4Array
(
    [0] => 1
    [1] => 3
    [2] => 5
    [3] => 6
)

DEMO