我有这个简单的模式,将文本分成句点
$text = preg_split("/[\.:!\?]+/", $text);
但我想包括。 : 要么 !在数组项的末尾
IE现在用于“好:新闻!每个人!”我有:
array("good","news","everyone","");
但我想要的是:
array("good:","news.","everyone!","");
答案 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进行测试。