如何在preg_split()的结果中包含拆分分隔符


How do I include the split delimiter in results for preg_split()?

我有一个将文本拆分为句点的简单模式:

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

但是我希望在数组项的末尾包含. :!

也就是说,现在是"好消息。大家!"我有:

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

但我想要:

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

开始:

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!'
);

如果您在模式中使用了正向查找,则不使用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在线函数测试仪来测试它。