2

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

这就是使用 explode() 的作用:

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

但是我需要的输出是:

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

我将如何实现所需的输出?

4

2 回答 2

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)组)。

于 2012-12-07T12:33:26.403 回答
2
$str = '1*:2:3*:4';
$res = preg_split('~(?<!\*):~',$str);
print_r($res);

将输出

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

该模式基本上说:

用 [不以星号开头的冒号] 分隔

于 2012-12-07T12:46:44.957 回答