2014-09-04 120 views
-3

我有一個像這兩個環節:如何解析並將部分字符串放入數組中?

http://www.something.com/something/edit/id/$id/type/$type 

而且

http://www.something.com/something/edit/id/:id/type/:type/collection/:collection 

,因爲我不擅長PHP的正則表達式,我想從這兩個環節提取此:

// first link 
array(
    'id', 'type', 
); 

// second link 
array('id', 'type', 'collection'); 

是否可以使用PHP的RegEx解析和提取這些$id:type部分字符串?

謝謝大家的幫助!


編輯:

爲了你下的選民,請已瞭解,我想提取所有這些項目開始$:並與/或空字符串結束,並推那些以這種格式匹配到一個新的數組。

+1

您可能不想爲此使用正則表達式。 – 2014-09-04 11:41:24

+0

我想將所有以'$'或':'開始並以'/'或空字符串結尾的部分抽取到數組中。 – zlomerovic 2014-09-04 11:41:59

+0

@ TheParamagneticCroissant - 那該怎麼做呢? – zlomerovic 2014-09-04 11:44:08

回答

2

您可以使用正則表達式與look behind assertion

$link = 'http://www.something.com/something/edit/id/$id/type/$type'; 
// or 
$link = 'http://www.something.com/something/edit/id/:id/type/:type/collection/:collection'; 

preg_match_all('~(?<=[:$])[^/]+~', $link, $matches); 
var_dump($matches); 

說明:

~   Pattern delimiter 
(?<=[:$]) Lookbehind assertion. Matches : or $ 
[^/]+  Any character except of/- multiple times 
~   Pattern delimiter  
+0

我要接受這個答案。謝謝你! – zlomerovic 2014-09-04 11:51:16

+0

好的。你可能完全用你的問題來回答。如果任何人立即清楚地瞭解問題,它可能會得到提升。當人們閱讀「url,parse,variables,PHP」這些短語時,他們可能傾向於說這個*已經被回答了,但是我認爲你所做的最後是一些特別的東西。 – hek2mgl 2014-09-04 11:55:16

+0

'我想從$或:開始提取所有這些項目。我認爲這兩個字符不會顯示在最終輸出中。 – 2014-09-04 11:57:08

1

先刪除

$string = str_replace('http://www.something.com/something/edit/', '', $url); 

的任何不必要的部分比explode休息串

+0

不錯,但@ hek2mgl的例子更好。謝謝你。 – zlomerovic 2014-09-04 11:51:01

1

我想你想這樣的事情,

(?<=\/id\/)[^\/]+|\/type\/\K[^\/]*|collection\/\K[^\/\n]* 

DEMO

代碼:

<?php 
$string = <<<EOD 
http://www.something.com/something/edit/id/\$id/type/\$type 
http://www.something.com/something/edit/id/:id/type/:type/collection/:collection 
EOD; 
preg_match_all('~(?<=\/id\/)[^\/\n]+|\/type\/\K[^\/\n]*|collection\/\K[^\/\n]*~', $string, $matches); 
var_dump($matches); 
?> 

輸出:

array(1) { 
    [0]=> 
    array(5) { 
    [0]=> 
    string(3) "$id" 
    [1]=> 
    string(5) "$type" 
    [2]=> 
    string(3) ":id" 
    [3]=> 
    string(5) ":type" 
    [4]=> 
    string(11) ":collection" 
    } 
}