Dapatkan n karakter string pertama


320

Bagaimana saya bisa mendapatkan n karakter pertama dari string di PHP? Apa cara tercepat untuk memangkas string ke sejumlah karakter tertentu, dan menambahkan '...' jika diperlukan?


5
mungkin lebih baik menggunakan karakter elipsis ...
Keet

1
lihat jawaban saya jika Anda perlu menghindari pemotongan kata.
TechNyquist


Coba Tautan Ini, Dapat membantu Anda ... stackoverflow.com/a/26098951/3944217
edCoder

Jawaban:


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

Memperbarui:

Berdasarkan saran untuk memeriksa panjang (dan juga memastikan panjang yang serupa pada string yang dipangkas dan tidak terpangkas):

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

Jadi Anda akan mendapatkan string maksimal 13 karakter; 13 (atau kurang) karakter normal atau 10 karakter diikuti oleh '...'

Pembaruan 2:

Atau sebagai fungsi:

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

Pembaruan 3:

Sudah lama sejak saya menulis jawaban ini dan saya tidak benar-benar menggunakan kode ini lagi. Saya lebih suka fungsi ini yang mencegah putusnya string di tengah kata menggunakan wordwrapfungsi:

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
mungkin lebih baik untuk mengganti dengan ellipsis (...) daripada 3 titik (...)
Keet

3
Saya suka ini, tetapi saya mengubahnya dan menggunakan yang berikut untuk menghapus spasi putih di akhir: $ string = substr (trim ($ string), 0,10) .'... '; Dengan begitu Anda mendapatkan sesuatu seperti "Saya suka ..." bukannya "Saya suka ...".
Kenton de Jong

28
"hellip" - membawa saya kadang-kadang untuk memahami bahwa kita tidak berbicara tentang alamat ip Setan
Lucas Bernardo de Sousa

2
Pembaruan 3 adalah yang paling bermanfaat.
milkovsky

Seandainya ada batasan keras pada panjang string yang dikembalikan, bukankah seharusnya baris 5 dari pembaruan 3 dibuat $string = wordwrap($string, $length - sizeof($append)); ?
Michael Crenshaw

115

Fungsi ini telah dibangun ke dalam PHP sejak versi 4.0.6. Lihat dokumen .

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

// outputs Hello W...

Perhatikan bahwa trimmarker(elipsis di atas) termasuk dalam panjang terpotong.


4
Bekerja dengan sempurna untuk saya. Jawaban teratas tidak berhasil, dan saya senang itu tidak karena terus menggulir dan menemukan permata ini.
Eduardo

Terima kasih, saya selalu menggunakan metode yang lebih lama & lebih lama ini!
gr3g

1
Dan, Anda mungkin ingin sedikit lebih spesifik tentang bagian mana dari jawaban teratas yang tidak berhasil untuk Anda. Fungsi truncate () bekerja dengan sempurna untuk saya dan keuntungan dari jawaban itu atas jawaban bruchowski adalah ia terputus pada batas kata; dengan asumsi Anda peduli tentang hal semacam itu.
pdwalker

2
tangkapan yang bagus! banyak pengembang PHP yang berpengalaman tidak tahu tentang fungsi ini :)
jroi_web

1
Jawaban teratas (sekarang) ( stackoverflow.com/a/3161830/236306 ) tidak melakukan apa-apa (seolah-olah saya tidak menggunakan fn sama sekali). Tidak tahu kenapa Namun jawaban ini tampaknya sempurna dan datang dengan manfaat tambahan dari bekerja.
Alan

15

Ekstensi Multibyte bisa berguna jika Anda perlu mengontrol charset string.

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

Kode ini menambahkan tiga titik ke string? kode saya memiliki tag tautan <a> dan ketika saya menautkannya, kode itu akan menautkannya bersama dengan tiga titik yang akan muncul sebagai nilai yang berbeda.
fello

9

kadang-kadang, Anda perlu membatasi string ke kata lengkap terakhir yaitu: Anda tidak ingin kata terakhir menjadi rusak alih-alih Anda berhenti dengan kata terakhir kedua.

misalnya: kita perlu membatasi "Ini adalah String saya" untuk 6 karakter tetapi alih-alih 'Ini saya ... "kami ingin itu menjadi' Ini ..." yaitu kita akan melewatkan huruf-huruf yang rusak di kata terakhir.

Fiuh, saya buruk dalam menjelaskan, ini kodenya.

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

Jika Anda ingin berhati-hati untuk tidak membagi kata, Anda dapat melakukan hal berikut

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

jika $ str lebih pendek dari $ n_chars mengembalikannya tanpa disentuh.

Jika $ str sama dengan $ n_chars mengembalikannya juga.

jika $ str lebih panjang dari $ n_chars maka ia mencari ruang berikutnya untuk memotong atau (jika tidak ada lebih banyak ruang sampai akhir) $ str akan dipotong kasar di $ n_chars.

CATATAN: perlu diketahui bahwa metode ini akan menghapus semua tag jika menggunakan HTML.


8

Kerangka kerja codeigniter berisi helper untuk ini, disebut "text helper". Berikut beberapa dokumentasi dari panduan pengguna codeigniter yang berlaku: http://codeigniter.com/user_guide/helpers/text_helper.html (baca saja bagian word_limiter dan character_limiter). Berikut ini dua fungsi yang relevan dengan pertanyaan Anda:

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

Dan

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) . "...";

Dari @Brendon Bullen di atas .. $ string = (strlen ($ string)> 13)? substr ($ string, 0,10) .'... ': $ string; Bagus!
MarcoZen

1

Fungsi yang saya gunakan:

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

Lihat itu dalam aksi .


1

Inilah yang saya lakukan

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

di mana $ num berarti jumlah karakter, dan $ tt string untuk manipulasi.


1

Saya mengembangkan fungsi untuk penggunaan ini

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

Anda hanya memanggil fungsi dengan tali dan limite
misalnya: str_short("hahahahahah",5);
itu akan memotong string Anda dan menambahkan "..." di akhir
:)


1

Untuk membuat dalam suatu fungsi (untuk penggunaan berulang) dan panjang terbatas dinamis, gunakan:

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

Yang terbaik adalah abstrak kode Anda seperti itu (perhatikan batasnya opsional dan default ke 10):

print limit($string);


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

1
Itu tidak akan berfungsi karena trim () sudah ada.
Gordon

Bisakah menjelaskan mengapa pendekatan ini lebih baik daripada hanya menyatakan bahwa itu pendekatan yang terbaik?
Robert

1
@Robert itu sederhana, dan abstrak berarti Anda tidak perlu mengetik ulang kode berulang-ulang. Dan yang paling penting, jika Anda menemukan cara yang lebih baik untuk melakukan ini, atau menginginkan sesuatu yang lebih kompleks, Anda hanya mengubah fungsi 1 ini alih-alih 50 buah kode.
TravisO

2
Mengapa fungsinya huruf besar?
Carlo

Perbaiki: substr dari $ var, bukan $ string. Uji terhadap $limit + 3sehingga Anda tidak memangkas string hanya melewati batas. Bergantung pada aplikasi Anda (misalnya, output HTML), pertimbangkan untuk menggunakan entitas &hellip;sebagai gantinya (secara tipografi lebih menyenangkan). Seperti yang disarankan sebelumnya, potong non-huruf dari ujung string (disingkat) sebelum menambahkan elipsis. Akhirnya, hati-hati jika Anda berada di lingkungan multibyte (mis., UTF-8) - Anda tidak dapat menggunakan strlen () dan substr ().
Phil Perry


0

substr () akan menjadi yang terbaik, Anda juga ingin memeriksa panjang string terlebih dahulu

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

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

wordwrap tidak akan memotong talinya, cukup pisahkan saja ...


0

$ width = 10;

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

atau dengan wordwrap

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

0

solusi ini tidak akan memotong kata, itu akan menambah tiga titik setelah spasi pertama. Saya mengedit solusi @ Raccoon29 dan saya mengganti semua fungsi dengan fungsi mb_ sehingga ini akan bekerja untuk semua bahasa seperti bahasa arab

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

Jika tidak ada persyaratan keras pada panjang string terpotong, seseorang dapat menggunakan ini untuk memotong dan mencegah pemotongan kata terakhir juga:

$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, " ")));

Dalam hal ini, $previewakan "Knowledge is a natural right of every human being".

Contoh kode langsung: http://sandbox.onlinephpfunctions.com/code/25484a8b687d1f5ad93f62082b6379662a6b4713

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.