PHP:显示字符串的前三个句子

时间:2014-04-08 21:03:31

标签: php regex string

我试图编写一个简单的函数,将字符串截断为前三个句子。我写了以下内容并且效果很好:

function getExcerpt($string) {
    if($string != "") {
        $strArray = explode('. ', $string);
        return $strArray[0].'. '.$strArray[1].'. '.$strArray[2].'. ';
    }
    return $string;
}

问题是,当前几句话结束时,它会失败?"?"或"!"。

因此,例如,以下文字被视为一个句子,而不是三个

  

什么是情报?我们如何定义情报?本文试图回答这个问题。

explode没用,所以我认为我会使用preg_split - 但问题是我需要更换"?" s和& #34;!" s在他们正确的位置。

解决此问题的简单方法是什么?有没有方便的PHP"句子"功能我不知道?

3 个答案:

答案 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;
}