文字列の最初のn文字を取得する


320

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


5
省略記号を使用した方がよいかもしれません…
Keet

1
言葉のカットを避ける必要がある場合は、私の答えを確認してください。
TechNyquist 2014


このリンクをお試しください、役立つ場合があります... stackoverflow.com/a/26098951/3944217
edCoder '29

回答:


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

11
3つのドット(...)ではなく省略記号(…)に置き換えるのが最善かもしれません
Keet

3
私はこれが好きですが、変更して、次のようにして末尾の空白を削除します。$ string = substr(trim($ string)、0,10).'... '; そうすることで、「I like to ...」ではなく、「I like to ...」のようなものが得られます。
Kenton de Jong

28
"hellip"-私たちがサタンのIPアドレスについて話していないことを理解するのにしばらくかかりました
Lucas Bernardo de Sousa

2
Update 3が最も役立ちます。
milkovsky

返される文字列の長さにハードキャップがある場合、更新3の5行目はそうではありません$string = wordwrap($string, $length - sizeof($append)); か?
Michael Crenshaw 2017年

115

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

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

// outputs Hello W...

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


4
私には完璧に働きました。一番上の答えはうまくいきませんでした。スクロールし続けてこの宝石を見つけたのでうまくいかなかったので嬉しいです。
Eduardo

ありがとう、私はいつもこれより長くて古い方法を使用しました!
gr3g 2014年

1
ダン、あなたはトップアンサーのどの部分がうまくいかなかったかについてもう少し具体的にしたいかもしれません。関数truncate()は私にとって完璧に機能しました。bruchowskiの回答に対するその回答の利点は、単語の境界で途切れることです。そんなことを気にかけていると思います。
pdwalker 2014年

2
良いキャッチ!多くの経験豊富なPHP開発者はこの関数を知らない:)
jroi_web

1
一番上の(今のところ)回答(stackoverflow.com/a/3161830/236306)は何もしませんでした(まるでfnをまったく使用しなかったかのように)。理由がわからない。ただし、この回答は完璧に思え、作業の利点が追加されました。
Alan

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) . '...';
}

このコードは、文字列に3つのドットを追加していますか?私のコードにはリンクタグ<a>があり、リンクすると、異なる値として表示される3つのドットと一緒にリンクされます。
フェロー

9

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

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

ふw、説明が苦手です。こちらがコードです。

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

}

9

単語を分割しないように注意してカットしたい場合は、次のようにすることができます

function ellipse($str,$n_chars,$crop_str=' [...]')
{
    $buff=strip_tags($str);
    if(strlen($buff) > $n_chars)
    {
        $cut_index=strpos($buff,' ',$n_chars);
        $buff=substr($buff,0,($cut_index===false? $n_chars: $cut_index+1)).$crop_str;
    }
    return $buff;
}

$ strが$ n_charsより短い場合、そのままの状態で返します。

$ strが$ n_charsと等しい場合、それをそのまま返します。

$ strが$ n_charsより長い場合は、次にカットするスペースを探すか、または(最後までスペースがない場合)$ strが$ n_charsで失礼にカットされます。

注: HTMLの場合、このメソッドはすべてのタグを削除することに注意してください。


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


3
if(strlen($text) > 10)
     $text = substr($text,0,10) . "...";

上記の@Brendon Bullenから.. $ string =(strlen($ string)> 13)?substr($ string、0,10).'... ':$ string; いいね!
MarcoZen

1

私が使用した機能:

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

実際ご覧ください。


1

これが私がすることです

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

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


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

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


1

関数内で(繰り返し使用するために)動的に制限された長さで作成するには、以下を使用します。

function string_length_cutoff($string, $limit, $subtext = '...')
{
    return (strlen($string) > $limit) ? substr($string, 0, ($limit-strlen(subtext))).$subtext : $string;
}

// example usage:
echo string_length_cutoff('Michelle Lee Hammontree-Garcia', 26);

// or (for custom substitution text
echo string_length_cutoff('Michelle Lee Hammontree-Garcia', 26, '..');

1

次のようにコードを抽象化するのが最適です(制限はオプションであり、デフォルトは10です)。

print limit($string);


function limit($var, $limit=10)
{
    if ( strlen($var) > $limit )
    {
        return substr($string, 0, $limit) . '...';
    }
    else
    {
        return $var;
    }
}

1
trim()が既に存在するため、これは機能しません。
Gordon

このアプローチが優れていると主張するのではなく、なぜこのアプローチが最適なのかを説明できますか?
ロバート

1
@Robertはシンプルで、抽象化することで、コードを何度も入力する必要がなくなります。そして最も重要なのは、これを行うためのより良い方法を見つけた場合、またはより複雑なものが必要な場合は、50個のコードではなく、この1つの関数のみを変更することです。
TravisO

2
なぜ関数は大文字なのですか?
Carloの

修正:$ stringではなく、$ varのsubstr。テスト$limit + 3あなたは、文字列をトリミングしないようにだけ制限を超えます。アプリケーション(HTML出力など)に応じて、&hellip;代わりにエンティティを使用することを検討してください(通常はより楽しい)。前に提案したように、省略記号を追加する前に、(短縮された)文字列の末尾から文字以外を削除します。最後に、マルチバイト(UTF-8など)環境の場合は注意してください。strlen()およびsubstr()は使用できません。
Phil Perry


0

substr()が最適です。最初に文字列の長さを確認することもできます。

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

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

ワードラップは文字列をトリミングせず、分割するだけです...


0

$ width = 10;

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

またはワードラップで

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

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

0
$yourString = "bla blaaa bla blllla bla bla";
$out = "";
if(strlen($yourString) > 22) {
    while(strlen($yourString) > 22) {
        $pos = strrpos($yourString, " ");
        if($pos !== false && $pos <= 22) {
            $out = substr($yourString,0,$pos);
            break;
        } else {
            $yourString = substr($yourString,0,$pos);
            continue;
        }
    }
} else {
    $out = $yourString;
}
echo "Output String: ".$out;

0

切り捨てられた文字列の長さに厳しい要件がない場合は、これを使用して切り捨て、最後の単語の切り取りを防ぐこともできます。

$text = "Knowledge is a natural right of every human being of which no one
has the right to deprive him or her under any pretext, except in a case where a
person does something which deprives him or her of that right. It is mere
stupidity to leave its benefits to certain individuals and teams who monopolize
these while the masses provide the facilities and pay the expenses for the
establishment of public sports.";

// we don't want new lines in our preview
$text_only_spaces = preg_replace('/\s+/', ' ', $text);

// truncates the text
$text_truncated = mb_substr($text_only_spaces, 0, mb_strpos($text_only_spaces, " ", 50));

// prevents last word truncation
$preview = trim(mb_substr($text_truncated, 0, mb_strrpos($text_truncated, " ")));

この場合、に$previewなります"Knowledge is a natural right of every human being"

ライブコードの例:http : //sandbox.onlinephpfunctions.com/code/25484a8b687d1f5ad93f62082b6379662a6b4713

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.