2012-12-07 73 views
2

在PHP中,我需要將字符串拆分爲不帶前導「*」的「:」字符。根據前導字符的存在拆分字符串

這是使用爆炸(什麼)呢:

$string = "1*:2:3*:4"; 
explode(":", $string); 
output: array("1*", "2", "3*", "4") 

不過,我需要的輸出是:

output: array("1*:2", "3*:4") 

我將如何達到預期的輸出?

回答

2
$str = '1*:2:3*:4'; 
$res = preg_split('~(?<!\*):~',$str); 
print_r($res); 

將輸出

Array 
(
    [0] => 1*:2 
    [1] => 3*:4 
) 

圖案基本上說:

分裂由

+1

比我更優雅[冒號不是由星號引線]顯然我設法錯過'preg_split()'的存在:P – Maccath

+0

@Maccath謝謝。我正在考慮使用['preg_match_all()'](http://php.net/manual/en/function.preg-match-all.php),但後來我記得有這個函數,我很少需要/使用:)乾杯。 – inhan

4

您可能正在尋找preg_match_all()而不是explode(),因爲您正在嘗試更復雜的拆分,而不是explode()本身可以處理的。 preg_match_all()將允許您收集匹配特定模式的字符串的所有部分,使用正則表達式表示。你正在尋找的模式是沿着線的東西:

任何東西,除了:其次是*:其次是什麼,但:

所以,試試這個來代替:

preg_match_all('/[^:]+\*:[^:]+/', $string, $matches); 
print_r($matches); 

它會輸出類似於:

Array 
(
    [0] => Array 
     (
      [0] => 1*:2 
      [1] => 3*:4 
     ) 

) 

你應該能夠使用我這與您使用explode()的結果的方式大致相同,即使在數組中添加了維(它將匹配分成'組',並且所有結果都與整個表達式或第一個(第0)組匹配) 。