我试图编写一个简单的函数,将字符串截断为前三个句子。我写了以下内容并且效果很好:
function getExcerpt($string) {
if($string != "") {
$strArray = explode('. ', $string);
return $strArray[0].'. '.$strArray[1].'. '.$strArray[2].'. ';
}
return $string;
}
问题是,当前几句话结束时,它会失败?"?"或"!"。
因此,例如,以下文字被视为一个句子,而不是三个:
什么是情报?我们如何定义情报?本文试图回答这个问题。
explode
没用,所以我认为我会使用preg_split
- 但问题是我需要更换"?" s和& #34;!" s在他们正确的位置。
解决此问题的简单方法是什么?有没有方便的PHP"句子"功能我不知道?
答案 0 :(得分:4)
尝试
$strArray = preg_split('/([.?!]) /', $string, -1, PREG_SPLIT_DELIM_CAPTURE);
那将给你所有三个"终结者"字符后跟一个空格。
答案 1 :(得分:0)
您可以使用此正则表达式直接捕获前三个句子,前提是它们以一个或多个'。','?'结尾要么 '!' :
^([^.!?]+[.!?]+){3}
它抓住每个角色达到积分并且能够抓住多个积分,这样做三次。
工作示例:http://regex101.com/r/bT6qG3
编辑:我忘了在这种情况下你不需要使用preg_split。我没有用PHP编写很长时间,但我相信你应该使用preg_match,它会比用preg_split更有效。
答案 2 :(得分:0)
如何使用循环和strpos
$ArrString = array();
$start = 0;
for ($i=1; $i<=3; $i++) {
$pos = strpos(str_replace(array('?','!'),'.',$string),'.',$start)+1;
$ArrString[] = substr($string,$start,$pos-$start);
$start = $pos;
}