繁体   English   中英

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

[英]How to truncate a string in PHP to the sentence closest to a certain number of characters?

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

我有一个工作函数,但我的函数截断为最接近特定字符数的单词。

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 坐 amet,consectetur adipiscing 精英。 整数malesuada eleifend orci,eget dignissim ligula porttitor cursus。 Praesent 在 blandit enim。 Maecenas vitae eleifend est. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Maecenas pulvinar gravida tempor。

应缩短为:

Lorem ipsum dolor 坐 amet,consectetur adipiscing 精英。 整数malesuada eleifend orci,eget dignissim ligula porttitor cursus。

而不是像这样打破句子:

Lorem ipsum dolor 坐 amet,consectetur adipiscing 精英。 整数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 所说的其他内容。 如果句子太短/太长而不能将其剪掉并加上“...”可能会更好。 另外,您必须检查/转换空格,因为 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”。 像:

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

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

哈。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM