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

sky*_*e26 20 php preg-split

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

$text = preg_split("/[\.:!\?]+/", $text);
Run Code Online (Sandbox Code Playgroud)

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

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

array("good", "news", "everyone", "");
Run Code Online (Sandbox Code Playgroud)

但我想要的是:

array("good:", "news.", "everyone!", "");
Run Code Online (Sandbox Code Playgroud)

Eli*_*gem 47

干得好:

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

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

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

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

array (
    0 => 'good:',
    1 => 'news.',
    2 => 'everyone!'
);
Run Code Online (Sandbox Code Playgroud)

  • @ user1551496:然后您要处理标记。使用解析器而不是regex,因为[regex无法正确处理标记](http://stackoverflow.com/a/1732454/1230836) (2认同)

pmr*_*ule 5

没有用的PREG_SPLIT_DELIM_CAPTURE,如果你用一个积极的回顾后在你的模式.该函数将保留分隔符.

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

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

没有 PREG_SPLIT_NO_EMPTY标志的结果:

array (
    0 => 'good:',
    1 => 'news.',
    2 => 'everyone!',
    3 => ''
);
Run Code Online (Sandbox Code Playgroud)

结果 PREG_SPLIT_NO_EMPTY标志:

array (
    0 => 'good:',
    1 => 'news.',
    2 => 'everyone!'
);
Run Code Online (Sandbox Code Playgroud)

您可以使用此PHP在线函数测试程序对其进行测试.