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



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

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

function shortenString($string, $your_desired_width) {
  $parts = preg_split('/([snr]+)/', $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 sit amet, consectetur adipiscing elit.整数 malesuada eleifend orci, eget dignissim ligula porttitor cursus. 普雷森特在平淡无奇的埃尼姆。Maecenas vitae eleifend est.暨社会 Natoque penatibus et magnis dis parturient montes, nascetur ridiculus 小家。Maecenas pulvinar gravida tempor.

应缩短为:

Lorem ipsum dolor sit amet, consectetur adipiscing elit.整数 malesuada eleifend orci, eget dignissim ligula porttitor cursus.

而不是像这样打破句子:

Lorem ipsum dolor sit amet, consectetur adipiscing elit.整数 malesuada eleifend orci, eget dignissim ligula porttitor cursus. 普雷森特 在

感谢帮助。

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

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

它将字符串修剪为指定的最大长度,从此字符串中查找最后一个句子的结尾(. 或 ! 或 ?)的最后一次出现,并再次修剪到此匹配项。它返回一个或几个接近指定字符数的完整句子。

请纠正我的英语。

这就是我想出的...您应该检查句子是否比您要查找的 len 长。 其中包括G13N所说的其他事情。如果句子太短/太长,最好将其切掉并输入"..."。另外,您必须检查/转换空格,因为strppos只会查找给定的内容。

$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('/([snr]+)/', $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"。 喜欢:

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

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

呵。

我只是使用这种方法,它可以根据需要工作!

这样就不会创建新函数,代码干净简单。

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

最新更新