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?
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?
Jawaban:
//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 wordwrap
fungsi:
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;
}
$string = wordwrap($string, $length - sizeof($append));
?
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.
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) . '...';
}
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;
}
}
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.
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 = '…')
{
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 = '…')
{
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;
}
}
}
}
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 .
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
:)
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, '..');
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;
}
}
$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:
$result = current(explode("\n", wordwrap($str, $width, "...\n")));
PS Lihat beberapa contoh di sini https://stackoverflow.com/a/17852480/131337
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;
}
$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;
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, $preview
akan "Knowledge is a natural right of every human being"
.
Contoh kode langsung: http://sandbox.onlinephpfunctions.com/code/25484a8b687d1f5ad93f62082b6379662a6b4713