DBからブログ投稿を取得しています。テキストを最大340文字にトリミングしたい。
ブログ投稿が340文字を超える場合は、テキストを最後の完全な単語にトリミングし、最後に「...」を追加します。
E.g.
NOT: In the begin....
BUT: In the ...
他の回答は、テキストを大まかに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
最初にテキストを正確に340文字に切り詰めてから、文字列の最後の ''の場所を見つけて、その量に切り詰めたいようです。このような:
$string = substr($string, 0, 340);
$string = substr($string, 0, strrpos($string, ' ')) . " ...";
Mbstring拡張機能を有効にしている場合(現在ほとんどのサーバーにあります)、mb_strimwidth関数を使用できます。
echo mb_strimwidth($string, 0, 340, '...');
試してください:
preg_match('/^.{0,340}(?:.*?)\b/siu', $text, $matches);
echo $matches[0] . '...';
私はジョン・コンデの答えをメソッドに入れました:
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... */
関数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()を使用して、単語の文字列を指定された文字数にトリミングし、空白で適切に停止します。これはあなたに役立つと思います。
最も簡単な解決策
$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;
PHP、wordwrapなど)に付属する関数を使用してみることができます
print wordwrap($text,340) . "...";
なぜこのように?
実際のregexソリューションは非常に単純です:
/^(.{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
は非常に厳しい制限を維持することです(Mark Byersが言及したように)\w\b
の部分は、最後に空白や句読点を避けるためのものです(以下の1を参照)In the ...
が希望どおりに記述されているという事実にもかかわらず、In the...
の方がスムーズだと思います(In the,...
なども好きではありません)。