根据前导字符的存在拆分字符串

时间:2012-12-07 12:32:16

标签: php string explode

在PHP中,我需要用“:”字符分割字符串而不带前导“*”。

这就是使用explode()的方法:

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

然而我需要的输出是:

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

我如何实现所需的输出?

2 个答案:

答案 0 :(得分: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个)组匹配。

答案 1 :(得分:2)

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

将输出

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

模式基本上说:

  

由[不是由星号引出的冒号]分割

相关问题