从字符串(正则表达式)中获取特殊值


Get special values out of string (regex)

正则表达式对我来说是一件困难的事情。

我正在尝试从这个字符串中获取"值"149150

a:1:{s:7:"sliders";a:1:{s:10:"fullscreen";a:5:{s:6:"slides";a:2:{i:47;a:4:{s:9:"attach_id";s:3:"149";s:10:"slide_type";s:5:"image";s:5:"title";a:2:{s:5:"value";s:0:"";s:5:"color";s:0:"";}s:7:"caption";a:2:{s:5:"value";s:0:"";s:5:"color";s:0:"";}}i:48;a:4:{s:9:"attach_id";s:3:"150";s:10:"slide_type";s:5:"image";s:5:"title";a:2:{s:5:"value";s:0:"";s:5:"color";s:0:"";}s:7:"caption";a:2:{s:5:"value";s:0:"";s:5:"color";s:0:"";}}}s:9:"fit_style";s:7:"default";s:8:"controls";s:7:"default";s:6:"thumbs";s:3:"yes";s:8:"autoplay";s:7:"default";}}}

我试过这个没有任何好结果:

/^.*_id";s:3:"(.*)";.*$/

如果你坚持使用正则表达式,你需要在量词中添加一个'?',这样你就不会匹配组中的整个字符串:

/^.*_id";s:3:"(.*?)";.*$/

但是,这将只映射一个值。要映射所有这些,请使用:

_id";s:3:"(.*?)";

这是一个序列化字符串,请使用 unserialize

参考: http://php.net/manual/en/function.unserialize.php

你可以做:

$arr = unserialize($input);
foreach ($arr['sliders']['fullscreen']['slides'] as $a) { echo $a['attach_id']. "'n"; }
149
150

这是一个PHP序列化字符串,可以使用PHP中的unserialize函数解析出来。

但是,如果由于某种原因您确实需要使用正则表达式:

您正在使用的正则表达式与第一个值匹配,然后与字符串的整个其余部分匹配。.*是贪婪的。相反,您希望它是 Lazy,因此您可以在*后添加一个问号,如下所示:/^.*_id";s:3:"(.*?)";.*$/

其次,因为您使用的锚点^$,所以它只会匹配一个匹配项。删除定位点,或复制模式:

/_id";s:3:"(.*?)";/

/^.*_id";s:3:"(.*?)";.*_id";s:3:"(.*?)";.*$/

你可以在这里了解更多关于懒惰与贪婪的信息:http://www.regular-expressions.info/repeat.html

我的建议是使用定义的匹配而不是.*

/_id";s:3:"('d*)";/

只要是一个数字,这将使你的表达更具体,更清晰,让其他人阅读。

这是测试正则表达式的良好游乐场:http://www.regexr.com/3b74b

你应该使用解析器。使用正则表达式,您可以简单地做

(?<=;s:3:")'d+

请参阅演示。

https://regex101.com/r/vH0sZ0/2

$re = "/(?<=;s:3:'")''d+/"; 
$str = "a:1:{s:7:'"sliders'";a:1:{s:10:'"fullscreen'";a:5:{s:6:'"slides'";a:2:{i:47;a:4:{s:9:'"attach_id'";s:3:'"149'";s:10:'"slide_type'";s:5:'"image'";s:5:'"title'";a:2:{s:5:'"value'";s:0:'"'";s:5:'"color'";s:0:'"'";}s:7:'"caption'";a:2:{s:5:'"value'";s:0:'"'";s:5:'"color'";s:0:'"'";}}i:48;a:4:{s:9:'"attach_id'";s:3:'"150'";s:10:'"slide_type'";s:5:'"image'";s:5:'"title'";a:2:{s:5:'"value'";s:0:'"'";s:5:'"color'";s:0:'"'";}s:7:'"caption'";a:2:{s:5:'"value'";s:0:'"'";s:5:'"color'";s:0:'"'";}}}s:9:'"fit_style'";s:7:'"default'";s:8:'"controls'";s:7:'"default'";s:6:'"thumbs'";s:3:'"yes'";s:8:'"autoplay'";s:7:'"default'";}}}"; 
preg_match_all($re, $str, $matches);