2011-11-28 43 views
4

我試圖分裂/爆炸/使preg_split一個字符串,但我想保留分隔符例如:我試圖分裂/爆炸/使preg_split一個字符串,但我想保持的分隔符

explode('/block/', '/block/2/page/2/block/3/page/4'); 

預期結果:

array('/block/2/page/2', '/block/3/page/4'); 

不知道如果我必須循環,然後重新加上數組值或如果有一個更清潔的方式。

我試圖使preg_split()與PREG_SPLIT_DELIM_CAPTURE但我得到的線沿線的東西:

array('/block/, 2/page/2', '/block/, 3/page/4'); 

這是不是我想要的。任何幫助深表感謝。

+0

你想這樣做在同一行或只是做呢? –

+1

[有沒有辦法保持分隔符,而使用PHP爆炸或其他類似的功能?](http:// stackoverflow。問題/ 2938137/is-there-way-to-keep-delimiter-while-using-php-explode-or-other-similar-function) – Clive

+0

我已經閱讀過這個問題,我不認爲它是重複的 – Purplefish32

回答

7

您可以使用preg_match_all像這樣:

$matches = array(); 
preg_match_all('/(\/block\/[0-9]+\/page\/[0-9]+)/', '/block/2/page/2/block/3/page/4', $matches); 
var_dump($matches[0]); 

輸出:

array(2) { 
    [0]=> 
    string(15) "/block/2/page/2" 
    [1]=> 
    string(15) "/block/3/page/4" 
} 

Demo

編輯:This是我可以使preg_split做到最好。

$array = preg_split('#(/block/)#', '/block/2/page/2/block/3/page/4', -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); 

$result = array(); 
for($i = 0, $count = count($array); $i < $count; $i += 2) 
{ 
    $result[] = $array[$i] . $array[$i + 1]; 
} 

如果您仍然需要循環以添加分隔符,那麼使用正則表達式不值得。只需使用自己的爆炸和預先設置分隔符:

$delimiter = '/block/'; $results = array(); 
foreach(explode($delimiter, '/block/2/page/2/block/3/page/4') as $entry) 
{ 
    if(!empty($entry)) 
    { 
     $results[] = $delimiter . $entry; 
    } 
} 

Demo

最後編輯:解決了!下面是使用正則表達式的一個,preg_splitPREG_SPLIT_DELIM_CAPTURE

$regex = '#(/block/(?:\w+/?)+(?=/block/))#'; 
$flags = PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY; 
preg_split($regex, '/block/2/page/2/block/3/page/4', -1, $flags); 
preg_split($regex, '/block/2/page/2/order/title/sort/asc/block/3/page/4', -1, $flags); 

輸出解決方案:

array(2) { 
    [0]=> 
    string(15) "/block/2/page/2" 
    [1]=> 
    string(15) "/block/3/page/4" 
} 
array(2) { 
    [0]=> 
    string(36) "/block/2/page/2/order/title/sort/asc" 
    [1]=> 
    string(15) "/block/3/page/4" 
} 

Final Demo

+0

感謝您的回覆,在我的情況下,問題是,不知道事先存在多少段,例如: explode('/ block /','/ block/2/page/2/order/title/sort/ASC /塊/ 3 /頁/ 4' ); 預期結果: array('/ block/2/page/2/order/title/sort/asc','/ block/3/page/4'); – Purplefish32

+0

@ Purplefish32 - 我已經添加了更詳細的答案。不幸的是,我無法使用單個正則表達式實現理想的結果,並恢復爲預定分隔符。 – nickb

+0

完美的,我終於去了prepend分隔符的方法,像一個魅力的工作,謝謝你所有的答案 – Purplefish32

1

記住:

explode('/block/', '/block/2/page/2/block/3/page/4'); 

會導致:

array("", "2/page/2", "3/page/4"); 

你可以使用一個preg_match_all

preg_match_all(":(/block/.*?):", $string); // untested 

但只是在前面加上分隔符是一個更清晰的解決方案。

+0

感謝您的提示,我將如何去預先分隔符? – Purplefish32