26

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

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

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

也就是说,现在为“good:news.everyone!” 我有:

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

但我想要:

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

2 回答 2

58

干得好:

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!'
);
于 2012-08-01T11:59:58.390 回答
10

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对其进行测试。

于 2016-07-05T17:21:49.663 回答