2015-06-15 103 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