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

2022-08-30 15:32:10

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

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

但我想在数组项的末尾包含 或。. :!

也就是说,现在为了“好:新闻.大家!我有:

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

但我想要:

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

答案 1

给你:

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

答案 2

如果你在模式中使用正面的后视,则没有用。该函数将保留分隔符。PREG_SPLIT_DELIM_CAPTURE

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

如果您使用 ,它将只查找字符而不匹配它。因此,在 的情况下,函数不会丢弃字符。lookbehindpreg_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在线功能测试器对其进行测试


推荐