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は、amet、consecteturadipiscingelitに座ります。整数malesuadaeleifendorci、eget dignissim ligulaporttitorcursus。当たり障りのないエニムでPraesent。Maecenas vitaeeleifendest。Cumsociisnatoque penatibus et magnis dis parturient montes、nasceturridiculusmus。Maecenas pulvinargravidatempor。

次のように短縮する必要があります。

Lorem ipsum dolorは、amet、consecteturadipiscingelitに座ります。整数malesuadaeleifendorci、eget dignissim ligulaporttitorcursus。

このように文を壊す代わりに:

Lorem ipsum dolorは、amet、consecteturadipiscingelitに座ります。整数malesuadaeleifendorci、eget dignissim ligulaporttitorcursus。 でPraesent

ヘルプをいただければ幸いです。

4

4 に答える 4

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 に答える