如何将PHP中的字符串截断为最接近一定数量字符的句子?

时间:2012-04-20 22:15:28

标签: php string function

我想将我的字符串截断/缩短到最接近字符数量的句子。

我有一个工作函数,但我的函数会截断到最接近certaion数字的单词。

function shortenString($string, $your_desired_width) {
  $parts = preg_split('/([\s\n\r]+)/', $string, null, PREG_SPLIT_DELIM_CAPTURE);
  $parts_count = count($parts);

  $length = 0;
  $last_part = 0;
  for (; $last_part < $parts_count; ++$last_part) {
    $length += strlen($parts[$last_part]);
    if ($length > $your_desired_width) { break; }
  }

  return implode(array_slice($parts, 0, $last_part));
}

例如:

  

Lorem ipsum dolor坐下来,精神上的精神。整数   malesuada eleifend orci,eget dignissim ligula porttitor cursus。   在blandit enim中的Praesent。 Maecenas vitae eleifend est.Cum sociis   natoque penatibus et magnis dis parturient montes,nascetur ridiculus   亩。 Maecenas pulvinar gravida tempor。

应缩短为:

  

Lorem ipsum dolor坐下来,精神上的精神。整数   malesuada eleifend orci,eget dignissim ligula porttitor cursus。

而不是像这样打断句子:

  

Lorem ipsum dolor坐下来,精神上的精神。整数   malesuada eleifend orci,eget dignissim ligula porttitor cursus。    Praesent in

非常感谢帮助。

4 个答案:

答案 0 :(得分:4)

这就是我提出的......你应该检查句子是否比你正在寻找的len更长......除了g13n所说的内容之外。如果句子太短/太长而不能砍掉它并放上“......”可能会更好。另外,你必须检查/转换空格,因为strrpos只会查找给定的内容。

$maxlen = 150;
$file = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer malesuada eleifend orci, eget dignissim ligula porttitor cursus. Praesent in blandit enim. Maecenas vitae eleifend est. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Maecenas pulvinar gravida tempor.";
if ( strlen($file) > $maxlen ){
    $file = substr($file,0,strrpos($file,". ",$maxlen-strlen($file))+1);
}

如果您想使用相同的功能,可以试试这个:

function shortenString($string, $your_desired_width) {
  $parts = preg_split('/([\s\n\r]+)/', $string, null, PREG_SPLIT_DELIM_CAPTURE);
  $parts_count = count($parts);

  $length = 0;
  $last_part = 0;
  $last_taken = 0;
  foreach($parts as $part){
    $length += strlen($part);
    if ( $length > $your_desired_width ){
        break;
    }
    ++$last_part;
    if ( $part[strlen($part)-1] == '.' ){
        $last_taken = $last_part;
    }
  }
  return implode(array_slice($parts, 0, $last_taken));
}

答案 1 :(得分:3)

我尝试了几个函数和正则表达式,但没有一个像我希望的那样工作,所以我创建了这个:

function sentenceTrim($string, $maxLength = 300) {
    $string = preg_replace('/\s+/', ' ', trim($string)); // Replace new lines (optional)

    if (mb_strlen($string) >= $maxLength) {
        $string = mb_substr($string, 0, $maxLength);

        $puncs  = array('. ', '! ', '? '); // Possible endings of sentence
        $maxPos = 0;

        foreach ($puncs as $punc) {
            $pos = mb_strrpos($string, $punc);

            if ($pos && $pos > $maxPos) {
                $maxPos = $pos;
            }
        }

        if ($maxPos) {
            return mb_substr($string, 0, $maxPos + 1);
        }

        return rtrim($string) . '&hellip;';
    } else {
        return $string;
    }           
}

将字符串修剪为指定的最大长度,从该字符串中查找最后一个句子的最后一个(。或!或?),并再次修剪此事件。它返回一个或几个完整的句子,接近指定的字符数。

请更正我的英文。

答案 2 :(得分:2)

您可以使用像/^([^.]*?).*/这样的简单正则表达式,并将其替换为“$ 1”。像:

$output = preg_replace('/^([^.]+).*/', '$1.', $input);

那就是说,你必须要知道并非所有语言都有句点(。)作为句子分隔符。

HTH。

答案 3 :(得分:0)

我只是使用这种方法,它可以按要求工作!

这样,就不会创建任何新函数,并且代码简洁明了。

$ article = strlen($ article)> $ maxlength? substr($ article,0,$ maxlength):$ article;

相关问题