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?

Alex
sumber
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;
}
Brendan Bullen
sumber
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.

bruchowski
sumber
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) . '...';
}
Emil Vikström
sumber
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;
    }

}
MortalViews
sumber
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.

TechNyquist
sumber
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;
            }       
        }
    }
}
Matius
sumber
4

Gunakan substring

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

$foo = substr("abcde",0, 3) . "...";
Dlongnecker
sumber
3
Kode ini akan selalu menambahkan ... ke string, yang tidak diinginkannya.
TravisO
Anda memang benar, dan saya mengedit jawabannya. (Jawaban yang direvisi saat ini sedang menunggu tinjauan sejawat SO)
Chaya Cooper
3
if(strlen($text) > 10)
     $text = substr($text,0,10) . "...";
HCL
sumber
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 .

Benjamin Crouzier
sumber
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.

christoz
sumber
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
:)

Saikelu
sumber
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, '..');
tfont
sumber
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;
    }
}
TravisO
sumber
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
1

Saya tidak yakin apakah ini solusi tercepat, tetapi sepertinya ini adalah solusi terpendek:

$result = current(explode("\n", wordwrap($str, $width, "...\n")));

PS Lihat beberapa contoh di sini https://stackoverflow.com/a/17852480/131337

Sergiy Sokolenko
sumber
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 ...

tsgrasser
sumber
0

$ width = 10;

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

atau dengan wordwrap

$a = preg_replace ("~^(.{1,${width}}\b)(.+)~", '\\1…', $a);
akond
sumber
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;
}
Wakaf
sumber
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;
Jaykishan
sumber
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

jim_kastrin
sumber