2012-12-07 47 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)组匹配) 。