例如,我应该根据句子边界分割文章,例如“.
”,“?
”,“!
”和“:
”
但是众所周知,无论preg_split
还是explode
是否正常,它们都会删除分隔符。
任何帮助都会非常感激!
修改
我只能提出下面的代码,虽然效果很好。
$content=preg_replace('/([\.\?\!\:])/',"\\1[D]",$content);
谢谢!!!大家。得到3个答案只需五分钟!我必须道歉,因为在提问之前无法仔细查看PHP手册。抱歉。
答案 0 :(得分:19)
我觉得这值得补充。您可以在""之后保留分隔符。使用regex lookahead分割字符串:
$input = "The address is http://stackoverflow.com/";
$parts = preg_split('@(?=http://)@', $input);
// $parts[1] is "http://stackoverflow.com/"
如果分隔符具有固定长度,则可以在"之前保留分隔符。部分使用lookbehind:
$input = "The address is http://stackoverflow.com/";
$parts = preg_split('@(?<=http://)@', $input);
// $parts[0] is "The address is http://"
在大多数情况下,此解决方案更简单,更清洁。
答案 1 :(得分:15)
使用preg_split
时,您可以设置标志 PREG_SPLIT_DELIM_CAPTURE 并捕获分隔符。然后你可以把每一对2 n 和2 n +1并重新组合在一起:
$parts = preg_split('/([.?!:])/', $str, -1, PREG_SPLIT_DELIM_CAPTURE);
$sentences = array();
for ($i=0, $n=count($parts)-1; $i<$n; $i+=2) {
$sentences[] = $parts[$i].$parts[$i+1];
}
if ($parts[$n] != '') {
$sentences[] = $parts[$n];
}
注意将拆分分隔符打包到一个组中,否则将不会捕获它们。
答案 2 :(得分:8)
preg_split
标记的 PREG_SPLIT_DELIM_CAPTURE
将使用delimiter = 0
,match = 1
答案 3 :(得分:0)
试试T-Regx
<?php
$parts = pattern('([.?!:])')->split($string);