Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 正则表达式-从重复格式中提取字符串_Php_Regex - Fatal编程技术网

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

Php 正则表达式-从重复格式中提取字符串,php,regex,Php,Regex,编辑-已解决: 感谢您的回复-我了解到这实际上是串行格式的,并且没有必要使用正则表达式处理它 我为这个新问题道歉——我已经尝试了很多不同的方法,基于StackOverflow的答案,但没有运气。我还花了一段时间试验了一个在线正则表达式工具,试图自己解决这个问题 这是我正在检查的字符串: 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

编辑-已解决: 感谢您的回复-我了解到这实际上是串行格式的,并且没有必要使用正则表达式处理它

我为这个新问题道歉——我已经尝试了很多不同的方法,基于StackOverflow的答案,但没有运气。我还花了一段时间试验了一个在线正则表达式工具,试图自己解决这个问题

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

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个这样的条目 i、 e.正则表达式结果=[1,3,5,6]

这些是我试过的一些正则表达式。 我只能捕获第一个匹配或最后一个匹配,但不能捕获所有匹配-我不明白为什么正则表达式没有像我预期的那样重复:

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

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

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

谢谢

您可以使用这个正则表达式

/(?<=:")\d+(?=";)/g
试试这个。看演示

您需要使用,以便它可以在双引号内获得数字,该双引号前面是i:。;s:1:这里i:后面的点代表任何字符。锚点\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]);
?>

如果引号包含数字以外的字符,则将上述正则表达式中的\d+替换为[^]+。这不是使正则表达式过于复杂吗?i:。;s:1:。;应该有足够的准备来配合这次行动不需要吗?@Tensibai举个例子就可以了。如果双引号包含一个或多个字符怎么办?所以我们把它留给op。我们在这里讨论的是序列化数据,我很确定,只要s:1在引用部分之前,引用文本的内容长度不能超过1个字符……因此它可以是任何字符,但长度必须是1。我说的对吗?为什么不使用unserialize呢?博士,谢谢!!我现在觉得有点迟钝——我从未使用过PHP序列化/非序列化,也不知道它是那种格式。我正在编辑一个别人做过的老项目,我还以为这是一些自定义格式!非常感谢你!
<?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
)