2015-06-15 111 views
0

使用正则表达式对我来说是一件困难的事情。从字符串中获取特殊值(正则表达式)

我试图让 “价值” 和出这个字符串:

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:"(.*)";.*$/ 
+0

使用正确的解析器,.. –

回答

2

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

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

这种意志,但是,只是映射一个值。要映射所有的人,使用方法:

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

谢谢!我这样做了! – Mike

1

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

(?<=;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); 
1

你可以这样做:

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

这是一个PHP序列化字符串,它可以只使用unserialize function in PHP被解析出来。

但是,如果由于某种原因,你真的需要使用正则表达式:

您使用是匹配的第一个值正则表达式,然后的整个剩余部分。 .*是Greedy。相反,你希望它是懒惰的,所以你可以*这样后面添加一个问号:其次/^.*_id";s:3:"(.*?)";.*$/

,因为你正在使用锚^$,它只会匹配一个发生。要么删除锚点,或复制模式:

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

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

您可以了解更多关于懒惰VS这里贪婪:http://www.regular-expressions.info/repeat.html

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

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

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

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