15

DBからブログ投稿を取得しています。テキストを最大340文字にトリミングしたい。

ブログ投稿が340文字を超える場合は、テキストを最後の完全な単語にトリミングし、最後に「...」を追加します。

E.g.

NOT: In the begin....

BUT: In the ...
4

9 に答える 9

27

最初にテキストを正確に340文字に切り詰めてから、文字列の最後の''の位置を見つけて、その量まで切り詰めたいようです。このような:

$string = substr($string, 0, 340);
$string = substr($string, 0, strrpos($string, ' ')) . " ...";
于 2010-01-20T20:26:58.847 に答える
18

他の回答は、テキストを約340文字にする方法を示しています。それで問題ない場合は、他の回答のいずれかを使用してください。

ただし、非常に厳密な最大340文字が必要な場合は、他の回答は機能しません。'...'を追加すると文字列の長さが長くなる可能性があることを覚えておく必要があり、それを考慮する必要があります。

$max_length = 340;

if (strlen($s) > $max_length)
{
    $offset = ($max_length - 3) - strlen($s);
    $s = substr($s, 0, strrpos($s, ' ', $offset)) . '...';
}

また、ここでstrrposは、最初に文字列を短縮するのではなく、オフセットを使用して文字列内の正しい場所から直接検索を開始するオーバーロードを使用していることにも注意してください。

オンラインで動作することを確認してください:ideone

于 2010-01-20T20:30:04.030 に答える
17

mbstring拡張機能を有効にしている場合(現在ほとんどのサーバーにあります)、mb_strimwidth関数を使用できます。

echo mb_strimwidth($string, 0, 340, '...');
于 2014-06-07T05:31:16.170 に答える
7

試す:

preg_match('/^.{0,340}(?:.*?)\b/siu', $text, $matches);
echo $matches[0] . '...';
于 2010-01-20T20:26:02.417 に答える
2

私はジョン・コンデの答えを方法に入れました:

function softTrim($text, $count, $wrapText='...'){

    if(strlen($text)>$count){
        preg_match('/^.{0,' . $count . '}(?:.*?)\b/siu', $text, $matches);
        $text = $matches[0];
    }else{
        $wrapText = '';
    }
    return $text . $wrapText;
}

例:

echo softTrim("Lorem Ipsum is simply dummy text", 10);
/* Output: Lorem Ipsum... */

echo softTrim("Lorem Ipsum is simply dummy text", 33);
/* Output: Lorem Ipsum is simply dummy text */

echo softTrim("LoremIpsumissimplydummytext", 10);
/* Output: LoremIpsumissimplydummytext... */
于 2013-02-15T14:22:01.787 に答える
0

ワードラップなど、PHPに付属している関数を使用してみることができます

print wordwrap($text,340) . "...";
于 2010-01-21T01:22:11.130 に答える
0

関数trim_characters($ text、$ length = 340){

$length = (int) $length;
$text = trim( strip_tags( $text ) );

if ( strlen( $text ) > $length ) {
    $text = substr( $text, 0, $length + 1 );
    $words = preg_split( "/[\s]| /", $text, -1, PREG_SPLIT_NO_EMPTY );
    preg_match( "/[\s]| /", $text, $lastchar, 0, $length );
    if ( empty( $lastchar ) )
        array_pop( $words );

    $text = implode( ' ', $words ); 
}

return $text;

}

この関数trim_characters()を使用して、単語の文字列を指定された文字数にトリミングし、空白で適切に停止します。これはあなたに役立つと思います。

于 2012-11-01T11:47:28.683 に答える
0

なぜこのように?

  • 空白文字以外の単語の区切り(句読点など)をキャッチするために、部分文字列よりも正規表現ソリューションが好きです。
  • John Condoeのソリューションは、テキストを340文字にトリミングしてから最後の単語を終了するため、完全には正しくありません(したがって、多くの場合、必要以上に長くなります)

実際の正規表現ソリューションは非常に単純です。

/^(.{0,339}\w\b)/su

PHPの完全なメソッドは次のようになります。

function trim_length($text, $maxLength, $trimIndicator = '...')
{
        if(strlen($text) > $maxLength) {

            $shownLength = $maxLength - strlen($trimIndicator);

            if ($shownLength < 1) {

                throw new \InvalidArgumentException('Second argument for ' . __METHOD__ . '() is too small.');
            }

            preg_match('/^(.{0,' . ($shownLength - 1) . '}\w\b)/su', $text, $matches);                               

            return (isset($matches[1]) ? $matches[1] : substr($text, 0, $shownLength)) . $trimIndicator ;
        }

        return $text;
}

詳細説明:

  • $shownLength非常に厳しい制限を守ることです(マーク・バイアーズが述べたように)
  • 指定された長さが小さすぎる場合は例外がスローされます
  • \w\b一部は、最後に空白や句読点を避けることです(以下の1を参照)
  • 最初の単語が希望の最大長よりも長い場合、その単語は残酷にカットされます

  1. In the ...問題の結果が希望どおりに記述されているという事実にもかかわらず、私In the...はよりスムーズに感じます(また好きではないIn the,...など)
于 2016-02-05T14:02:48.610 に答える
0

最も簡単なソリューション

$text_to_be_trim= "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry standard.";
if(strlen($text_to_be_trim) > 20)   
    $text_to_be_trim= substr($text_to_be_trim,0,20).'....';

マルチバイトテキストの場合

$stringText= "UTIL CONTROL DISTRIBUCION AMARRE CIGÜEÑAL";
$string_encoding = 'utf8';
$s_trunc =  mb_substr($stringText, 0, 37, $string_encoding);
echo $s_trunc;
于 2017-05-23T11:38:25.407 に答える