350

PHPで文字列の最初のn文字を取得するにはどうすればよいですか? 文字列を特定の文字数にトリミングし、必要に応じて「...」を追加する最も速い方法は何ですか?

4

20 に答える 20

627
//The simple version for 10 Characters from the beginning of the string
$string = substr($string,0,10).'...';

アップデート:

長さをチェックするための提案に基づいて(また、トリミングされた文字列とトリミングされていない文字列で同様の長さを確保します):

$string = (strlen($string) > 13) ? substr($string,0,10).'...' : $string;

したがって、最大 13 文字の文字列が取得されます。13 文字 (またはそれ以下) の通常の文字または 10 文字の後に「...」が続く

更新 2:

または関数として:

function truncate($string, $length, $dots = "...") {
    return (strlen($string) > $length) ? substr($string, 0, $length - strlen($dots)) . $dots : $string;
}

更新 3:

この回答を書いてからしばらく経ちましたが、実際にはこのコードをもう使用していません。関数を使用して単語の途中で文字列が壊れないようにするこの関数を好みwordwrapます。

function truncate($string,$length=100,$append="…") {
  $string = trim($string);

  if(strlen($string) > $length) {
    $string = wordwrap($string, $length);
    $string = explode("\n", $string, 2);
    $string = $string[0] . $append;
  }

  return $string;
}
于 2010-07-01T21:30:17.370 に答える
137

この機能は、バージョン 4.0.6 以降の PHP に組み込まれています。ドキュメントを参照してください

echo mb_strimwidth('Hello World', 0, 10, '...');

// outputs Hello W...

trimmarker(上記の省略記号) は切り捨てられた長さに含まれることに注意してください。

于 2014-07-03T22:56:09.353 に答える
15

文字列文字セットを制御する必要がある場合は、マルチバイト拡張機能が便利です。

$charset = 'UTF-8';
$length = 10;
$string = 'Hai to yoo! I like yoo soo!';
if(mb_strlen($string, $charset) > $length) {
  $string = mb_substr($string, 0, $length - 3, $charset) . '...';
}
于 2010-07-01T21:35:34.330 に答える
11

場合によっては、文字列を最後の完全な単語に制限する必要があります。つまり、最後の単語を分割したくない場合は、最後から 2 番目の単語で停止します。

例: 「This is my String」を 6 文字に制限する必要がありますが、「This i...」ではなく「This...」にする必要があります。つまり、最後の単語の壊れた文字をスキップします。

ふぅ、説明が下手ですが、これがコードです。

class Fun {

    public function limit_text($text, $len) {
        if (strlen($text) < $len) {
            return $text;
        }
        $text_words = explode(' ', $text);
        $out = null;


        foreach ($text_words as $word) {
            if ((strlen($word) > $len) && $out == null) {

                return substr($word, 0, $len) . "...";
            }
            if ((strlen($out) + strlen($word)) > $len) {
                return $out . "...";
            }
            $out.=" " . $word;
        }
        return $out;
    }

}
于 2013-03-23T08:27:15.537 に答える
8

codeigniter フレームワークには、「テキスト ヘルパー」と呼ばれる、このためのヘルパーが含まれています。適用される codeigniter のユーザー ガイドのドキュメントを次に示します: http://codeigniter.com/user_guide/helpers/text_helper.html (word_limiter および character_limiter セクションを読んでください)。あなたの質問に関連する2つの機能は次のとおりです。

if ( ! function_exists('word_limiter'))
{
    function word_limiter($str, $limit = 100, $end_char = '&#8230;')
    {
        if (trim($str) == '')
        {
            return $str;
        }

        preg_match('/^\s*+(?:\S++\s*+){1,'.(int) $limit.'}/', $str, $matches);

        if (strlen($str) == strlen($matches[0]))
        {
            $end_char = '';
        }

        return rtrim($matches[0]).$end_char;
    }
}

if ( ! function_exists('character_limiter'))
{
    function character_limiter($str, $n = 500, $end_char = '&#8230;')
    {
        if (strlen($str) < $n)
        {
            return $str;
        }

        $str = preg_replace("/\s+/", ' ', str_replace(array("\r\n", "\r", "\n"), ' ', $str));

        if (strlen($str) <= $n)
        {
            return $str;
        }

        $out = "";
        foreach (explode(' ', trim($str)) as $val)
        {
            $out .= $val.' ';

            if (strlen($out) >= $n)
            {
                $out = trim($out);
                return (strlen($out) == strlen($str)) ? $out : $out.$end_char;
            }       
        }
    }
}
于 2010-07-06T01:43:53.943 に答える
4
if(strlen($text) > 10)
     $text = substr($text,0,10) . "...";
于 2010-07-01T21:31:02.160 に答える
3

部分文字列を使用

http://php.net/manual/en/function.substr.php

$foo = substr("abcde",0, 3) . "...";
于 2010-07-01T21:32:32.957 に答える
1

これが私がすることです

    function cutat($num, $tt){
        if (mb_strlen($tt)>$num){
            $tt=mb_substr($tt,0,$num-2).'...';
        }
        return $tt;
    }

ここで、$ numは文字数を表し、$ttは操作用の文字列を表します。

于 2013-03-21T16:56:42.717 に答える
1

そのようにコードを抽象化するのが最善です(制限はオプションであり、デフォルトは10であることに注意してください)。

print limit($string);


function limit($var, $limit=10)
{
    if ( strlen($var) > $limit )
    {
        return substr($string, 0, $limit) . '...';
    }
    else
    {
        return $var;
    }
}
于 2010-07-01T21:35:12.863 に答える
1

私が使用した機能:

function cutAfter($string, $len = 30, $append = '...') {
        return (strlen($string) > $len) ? 
          substr($string, 0, $len - strlen($append)) . $append : 
          $string;
}

実際に見てください。

于 2011-09-21T19:59:36.237 に答える
1

この用途のために関数を開発しました

 function str_short($string,$limit)
        {
            $len=strlen($string);
            if($len>$limit)
            {
             $to_sub=$len-$limit;
             $crop_temp=substr($string,0,-$to_sub);
             return $crop_len=$crop_temp."...";
            }
            else
            {
                return $string;
            }
        }

文字列と limite を使用して関数を呼び出すだけ
ですstr_short("hahahahahah",5)
それはあなたの文字列を切り取り、最後に「...」を追加します
:)

于 2013-02-04T06:08:03.240 に答える
0

substr() が最適です。最初に文字列の長さも確認する必要があります

$str = 'someLongString';
$max = 7;

if(strlen($str) > $max) {
   $str = substr($str, 0, $max) . '...';
}

wordwrap は文字列をトリミングせず、分割するだけです...

于 2010-07-01T21:42:37.580 に答える
0

このソリューションは単語を切り取らず、最初のスペースの後に 3 つのドットを追加します。@ Raccoon29 ソリューションを編集し、すべての関数をmb_関数に置き換えて、アラビア語などのすべての言語で機能するようにしました

function cut_string($str, $n_chars, $crop_str = '...') {
    $buff = strip_tags($str);
    if (mb_strlen($buff) > $n_chars) {
        $cut_index = mb_strpos($buff, ' ', $n_chars);
        $buff = mb_substr($buff, 0, ($cut_index === false ? $n_chars : $cut_index + 1), "UTF-8") . $crop_str;
    }
    return $buff;
}
于 2014-01-27T13:17:50.440 に答える
0

$幅 = 10;

$a = preg_replace ("~^(.{{$width}})(.+)~", '\\1…', $a);

またはワードラップを使用

$a = preg_replace ("~^(.{1,${width}}\b)(.+)~", '\\1…', $a);
于 2013-07-26T15:50:59.877 に答える