preg_split如何在结果中包含拆分分隔符?

时间:2012-08-01 11:42:28

标签: php preg-split

我有这个简单的模式,将文本分成句点

$text = preg_split("/[\.:!\?]+/", $text);

但我想包括。 : 要么 !在数组项的末尾

IE现在用于“好:新闻!每个人!”我有:

array("good","news","everyone","");

但我想要的是:

array("good:","news.","everyone!","");

2 个答案:

答案 0 :(得分:46)

你走了:

preg_split('/([^.:!?]+[.:!?]+)/', 'good:news.everyone!', -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);

工作原理:模式实际上将所有内容都变成了分隔符。然后,要在数组中包含这些分隔符,可以使用PREG_SPLIT_DELIM_CAPTURE常量。这将返回如下数组:

array (
    0 => '',
    1 => 'good:',
    2 => '',
    3 => 'news.',
    4 => '',
    5 => 'everyone!',
    6 => '',
);

要删除空值,请使用PREG_SPLIT_NO_EMPTY。要组合这些常量中的两个或更多个,我们使用按位|运算符。结果:

array (
    0 => 'good:',
    1 => 'news.',
    2 => 'everyone!'
);

答案 1 :(得分:5)

如果您在模式中使用positive lookbehind,则PREG_SPLIT_DELIM_CAPTURE无效。该函数将保留分隔符。

$text = preg_split('/(?<=[.:!?])/', 'good:news.everyone!', 0, PREG_SPLIT_NO_EMPTY);

如果你使用lookbehind,它只会寻找不匹配的角色。因此,在preg_split()的情况下,该函数不会丢弃该字符。

结果没有 PREG_SPLIT_NO_EMPTY标志:

array (
    0 => 'good:',
    1 => 'news.',
    2 => 'everyone!',
    3 => ''
);

结果 PREG_SPLIT_NO_EMPTY标志:

array (
    0 => 'good:',
    1 => 'news.',
    2 => 'everyone!'
);

您可以使用此PHP Online Function Tester进行测试。