6

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

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

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 sit amet, consectetur adipiscing elit。整数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。

应缩短为:

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。 存在于

帮助表示赞赏。

4

4 回答 4

6

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

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

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

请纠正我的英语。

于 2017-03-05T20:19:57.320 回答
5

这就是我想出的……您应该检查句子是否比您要查​​找的 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));
}
于 2012-04-20T22:35:05.137 回答
2

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

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

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

HTH。

于 2012-04-20T22:30:18.647 回答
0

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

这样就不会创建新的函数,代码也很简洁。

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

于 2020-03-01T17:37:18.070 回答