有使用php爆炸或其他类似的function保持分隔符的方法吗?
例如,我有一篇文章应该按照“ .
”,“ ?
”,“ !
”和“ :
”这样的句子边界来分割。
但是,所有人都知道,无论preg_split
还是explode
函数,它们都会删除分隔符。
任何帮助将非常感激!
编辑:
我只能拿出下面的代码,虽然它工作得很好。
$content=preg_replace('/([\.\?\!\:])/',"\\1[D]",$content);
谢谢!!! 大家。 得到3个答案只有五分钟! 在提出问题之前,我必须非常小心地看不到PHP手册。 抱歉。
带有PREG_SPLIT_DELIM_CAPTURE
标志的preg_split
将返回与delimiter = 0
匹配的数组, match = 1
当使用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]; }
注意将拆分分隔符打包到一个组中,否则将不会被捕获。
我觉得这值得补充。 你可以通过使用正则expression式分割来保留“after”string中的分隔符:
$input = "The address is http://stackoverflow.com/"; $parts = preg_split('@(?=http://)@', $input); // $parts[1] is "http://stackoverflow.com/"
如果分隔符的长度是固定的,则可以通过使用逆序来保留“之前”部分的分隔符:
$input = "The address is http://stackoverflow.com/"; $parts = preg_split('@(?<=http://)@', $input); // $parts[0] is "The address is http://"
这种解决scheme在大多数情况下更简单,更清洁。