2017-06-22 65 views
1

在使用兩個分隔符解析字符串並在分隔符的'after'部分保留分隔符時,我有點迷失了preg_split。我的分隔符是$或#。 例如:帶有兩個分隔符的PHP preg_split,並在「after」字符串中保留分隔符

$str = 'participant-$id#-group'; 
$ar = preg_split('/([^$#?]+[$#?]+)/', $str, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); 
echo "<pre>"; print_r($ar); echo "</pre>"; 

將顯示:

Array 
(
    [0] => participant_data-$ 
    [1] => id# 
    [2] => -group 
) 

不過,我需要:

Array 
(
    [0] => participant_data- 
    [1] => $id 
    [2] => #-group 
) 

正則表達式使我的大腦受到傷害。那麼有人可能會建議我如何使用PREG_SPLIT_DELIM_CAPTURE並在分段的開頭保留分隔符? 謝謝!

回答

1

試試這個:

$ar = preg_split('/(\$[^#]+)/', $str, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);

+0

工程就像一個魅力 - 謝謝。你能解釋嗎?標記正確 – user2968159

+0

@ user2968159我假設'$ id'以'$'開始,並且不包含'#',所以正則表達式'(\ $ [^#] +)'由'\ $'和'[^#] +'。 –

+0

@ user2968159它會返回分隔符模式,因爲已設置標誌'PREG_SPLIT_DELIM_CAPTURE'。再例如,它將爲輸入的'participant- $ id#-group- $ id2'返回'['participant-','$ id','#-group-','$ id2']'。希望這可以幫助。 –

1

這個怎麼樣。我抓住了分隔符,然後將它們放回到一起。

<?php 

$str = 'participant-$id#-group'; 
$ar = preg_split('/([^$#?]+[^$#?]+)/', $str, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); 
echo "<pre>"; print_r($ar); echo "</pre>"; 

/* 
Array 
(
    [0] => participant- 
    [1] => $ 
    [2] => id 
    [3] => # 
    [4] => -group 
) */ 

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

echo "<pre>"; print_r($result); echo "</pre>"; 

/* 
Array 
(
    [0] => participant- 
    [1] => $id 
    [2] => #-group 
) 
*/ 

?> 
+0

感謝您的建議Adder。我接受Razon的回答是想避免額外的循環 – user2968159