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?
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:
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 .
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.
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.
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:
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
:)
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,'..');
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 …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:
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
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".
Jawaban:
Memperbarui:
Berdasarkan saran untuk memeriksa panjang (dan juga memastikan panjang yang serupa pada string yang dipangkas dan tidak terpangkas):
Jadi Anda akan mendapatkan string maksimal 13 karakter; 13 (atau kurang) karakter normal atau 10 karakter diikuti oleh '...'
Pembaruan 2:
Atau sebagai fungsi:
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
wordwrap
fungsi:sumber
$string = wordwrap($string, $length - sizeof($append));
?Fungsi ini telah dibangun ke dalam PHP sejak versi 4.0.6. Lihat dokumen .
Perhatikan bahwa
trimmarker
(elipsis di atas) termasuk dalam panjang terpotong.sumber
Ekstensi Multibyte bisa berguna jika Anda perlu mengontrol charset string.
sumber
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.
sumber
Jika Anda ingin berhati-hati untuk tidak membagi kata, Anda dapat melakukan hal berikut
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.
sumber
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:
Dan
sumber
Gunakan substring
http://php.net/manual/en/function.substr.php
sumber
sumber
Fungsi yang saya gunakan:
Lihat itu dalam aksi .
sumber
Inilah yang saya lakukan
di mana $ num berarti jumlah karakter, dan $ tt string untuk manipulasi.
sumber
Saya mengembangkan fungsi untuk penggunaan ini
Anda hanya memanggil fungsi dengan tali dan limite
misalnya:
str_short("hahahahahah",5)
;itu akan memotong string Anda dan menambahkan "..." di akhir
:)
sumber
Untuk membuat dalam suatu fungsi (untuk penggunaan berulang) dan panjang terbatas dinamis, gunakan:
sumber
Yang terbaik adalah abstrak kode Anda seperti itu (perhatikan batasnya opsional dan default ke 10):
sumber
$limit + 3
sehingga Anda tidak memangkas string hanya melewati batas. Bergantung pada aplikasi Anda (misalnya, output HTML), pertimbangkan untuk menggunakan entitas…
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 ().Saya tidak yakin apakah ini solusi tercepat, tetapi sepertinya ini adalah solusi terpendek:
PS Lihat beberapa contoh di sini https://stackoverflow.com/a/17852480/131337
sumber
substr () akan menjadi yang terbaik, Anda juga ingin memeriksa panjang string terlebih dahulu
wordwrap tidak akan memotong talinya, cukup pisahkan saja ...
sumber
$ width = 10;
atau dengan wordwrap
sumber
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
sumber
sumber
Jika tidak ada persyaratan keras pada panjang string terpotong, seseorang dapat menggunakan ini untuk memotong dan mencegah pemotongan kata terakhir juga:
Dalam hal ini,
$preview
akan"Knowledge is a natural right of every human being"
.Contoh kode langsung: http://sandbox.onlinephpfunctions.com/code/25484a8b687d1f5ad93f62082b6379662a6b4713
sumber