Saya memiliki cuplikan kode yang ditulis dalam PHP yang menarik satu blok teks dari database dan mengirimkannya ke widget di halaman web. Blok teks asli dapat berupa artikel yang panjang atau satu atau dua kalimat pendek; tetapi untuk widget ini saya tidak dapat menampilkan lebih dari, katakanlah, 200 karakter. Saya dapat menggunakan substr () untuk memotong teks pada 200 karakter, tetapi hasilnya akan terpotong di tengah kata-kata - yang saya benar-benar inginkan adalah memotong teks pada akhir kata terakhir sebelum 200 karakter.
183
s($str)->truncateSafely(200)
bermanfaat, seperti yang ditemukan di perpustakaan mandiri ini .Jawaban:
Dengan menggunakan fungsi wordwrap . Ini membagi teks dalam beberapa baris sehingga lebar maksimum adalah yang Anda tentukan, melanggar batas kata. Setelah pemisahan, Anda cukup mengambil baris pertama:
Satu hal yang tidak ditangani oleh oneliner ini adalah kasus ketika teks itu sendiri lebih pendek dari lebar yang diinginkan. Untuk menangani kasus tepi ini, seseorang harus melakukan sesuatu seperti:
Solusi di atas memiliki masalah memotong teks sebelum waktunya jika mengandung baris baru sebelum cutpoint yang sebenarnya. Di sini versi yang memecahkan masalah ini:
Juga, di sini adalah testclass PHPUnit yang digunakan untuk menguji implementasi:
EDIT:
Karakter khusus UTF8 seperti 'à' tidak ditangani. Tambahkan 'u' di akhir REGEX untuk menanganinya:
$parts = preg_split('/([\s\n\r]+)/u', $string, null, PREG_SPLIT_DELIM_CAPTURE);
sumber
\n
sebelum lebar yang diinginkan.Arabic
huruf yang panjang dan dikurangi menjadi kata-kata yang benar sekarang dengan bantuantokenTruncate
fungsi .. tnx sejuta :)Ini akan mengembalikan 200 karakter kata pertama:
sumber
if (strlen($string) > $your_desired_width) { preg_replace(...); }
/\s+?(?:\S+)?$/
Dan begitulah - metode yang dapat diandalkan untuk memotong string apa pun ke seluruh kata terdekat, sambil tetap di bawah panjang string maksimum.
Saya sudah mencoba contoh lain di atas dan mereka tidak menghasilkan hasil yang diinginkan.
sumber
if
pernyataan:if (strlen($str) > 200) { ... }
$WidgetText = substr($string, 0, strpos($string, ' ', 200));
Solusi berikut ini lahir ketika saya perhatikan parameter $ break dari fungsi wordwrap :
Ini solusinya :
Contoh 1.
Contoh di atas akan menampilkan:
Contoh # 2.
Contoh di atas akan menampilkan:
sumber
description
posting blog)preg_replace('/\s+/', ' ', $description)
mengganti semua karakter spasi putih dengan satu ruang;)Ingatlah setiap kali Anda memisahkan dengan "kata" di mana saja bahwa beberapa bahasa seperti Cina dan Jepang tidak menggunakan karakter spasi untuk memecah kata. Selain itu, pengguna jahat dapat dengan mudah memasukkan teks tanpa spasi, atau menggunakan beberapa Unicode yang mirip dengan karakter ruang standar, dalam hal ini solusi apa pun yang Anda gunakan dapat tetap menampilkan seluruh teks. Cara untuk mengatasi hal ini adalah dengan memeriksa panjang string setelah membelahnya pada spasi seperti biasa, kemudian, jika string masih di atas batas abnormal - mungkin 225 karakter dalam kasus ini - terus maju dan membaginya dengan bodoh pada batas itu.
Satu lagi peringatan dengan hal-hal seperti ini ketika datang ke karakter non-ASCII; string yang mengandungnya dapat ditafsirkan oleh strlen () standar PHP sebagai lebih panjang dari yang sebenarnya, karena satu karakter dapat mengambil dua atau lebih byte daripada hanya satu. Jika Anda hanya menggunakan fungsi strlen () / substr () untuk membagi string, Anda dapat membagi string di tengah karakter! Jika ragu, mb_strlen () / mb_substr () sedikit lebih mudah.
sumber
Gunakan strpos dan substr:
Ini akan memberi Anda string yang terpotong di ruang pertama setelah 30 karakter.
sumber
Ini dia:
sumber
Inilah fungsi saya berdasarkan pendekatan @ Cd-MaN.
sumber
Deskripsi:
^
- mulai dari awal string([\s\S]{1,200})
- dapatkan dari 1 hingga 200 karakter apa pun[\s]+?
- tidak termasuk spasi pada akhir teks singkat sehingga kita dapat menghindariword ...
bukannyaword...
[\s\S]+
- cocok dengan semua konten lainnyaTes:
regex101.com
mari tambahkanor
beberapa lainnyar
regex101.com
orrrr
tepatnya 200 karakter.regex101.com
setelah kelimar
orrrrr
dikecualikan.Nikmati.
sumber
$1
adalah "pengganti", tetapi dalam konteks khusus ini apa yang dimaksud dengan ?? variabel kosong?$1
referensi untuk mencocokkan dalam kurung([\s\S]{1,200})
.$2
akan mereferensikan dua pasang kurung kedua jika ada dalam pola.Mengejutkan betapa sulitnya menemukan solusi sempurna untuk masalah ini. Saya belum menemukan jawaban pada halaman ini yang tidak gagal dalam setidaknya beberapa situasi (terutama jika string berisi baris baru atau tab, atau jika kata break adalah apa pun selain spasi, atau jika string memiliki UTF- 8 karakter multibyte).
Berikut adalah solusi sederhana yang berfungsi dalam semua kasus. Ada jawaban yang sama di sini, tetapi pengubah "s" penting jika Anda ingin bekerja dengan input multi-line, dan pengubah "u" membuatnya mengevaluasi dengan benar karakter multiby UTF-8.
Satu kemungkinan tepi kasus dengan ini ... jika string tidak memiliki spasi sama sekali dalam $ characterCount karakter pertama, itu akan mengembalikan seluruh string. Jika Anda menginginkannya memaksa break pada $ characterCount bahkan jika itu bukan batas kata, Anda dapat menggunakan ini:
Satu opsi terakhir, jika Anda ingin menambahkan ellipsis jika memotong string ...
sumber
Saya akan menggunakan fungsi preg_match untuk melakukan ini, karena apa yang Anda inginkan adalah ekspresi yang cukup sederhana.
Ekspresi berarti "cocok dengan setiap substring mulai dari awal panjang 1-200 yang berakhir dengan spasi." Hasilnya dalam $ hasil, dan pertandingan dalam $ cocok. Itu menangani pertanyaan awal Anda, yang secara khusus berakhir pada ruang apa pun. Jika Anda ingin mengakhiri di baris baru, ubah ekspresi reguler menjadi:
sumber
Ok jadi saya mendapatkan versi lain dari ini berdasarkan jawaban di atas tetapi mengambil lebih banyak hal dalam akun (utf-8, \ n dan & nbsp;), juga baris yang menghapus kode pendek wordpress yang dikomentari jika digunakan dengan wp.
sumber
Ini adalah perbaikan kecil untuk jawaban mattmac:
Satu-satunya perbedaan adalah menambahkan spasi di akhir $ string. Ini memastikan kata terakhir tidak terpotong sesuai komentar ReX357.
Saya tidak memiliki cukup poin rep untuk menambahkan ini sebagai komentar.
sumber
Pemakaian:
Ini akan menghasilkan 10 kata pertama.
The
preg_split
Fungsi ini digunakan untuk membagi string menjadi substring. Batas di mana string harus dipisah, ditentukan menggunakan pola ekspresi reguler.preg_split
fungsi mengambil 4 parameter, tetapi hanya 3 pertama yang relevan bagi kami saat ini.Parameter Pertama - Pola Parameter pertama adalah pola ekspresi reguler yang digunakan untuk memisahkan string. Dalam kasus kami, kami ingin membagi string melintasi batas kata. Oleh karena itu kami menggunakan kelas karakter yang telah ditentukan
\s
yang cocok dengan karakter spasi putih seperti spasi, tab, carriage return, dan umpan baris.Parameter Kedua - Input String Parameter kedua adalah string teks panjang yang ingin kita bagi.
Parameter Ketiga - Batas Parameter ketiga menentukan jumlah substring yang harus dikembalikan. Jika Anda menetapkan batas ke
n
, preg_split akan mengembalikan array n elemen.n-1
Elemen pertama akan berisi substring.(n th)
Elemen terakhir akan berisi sisa string.sumber
Berdasarkan regex @Justin Poliey:
sumber
Saya memiliki fungsi yang melakukan hampir apa yang Anda inginkan, jika Anda akan melakukan beberapa pengeditan, itu akan pas:
sumber
Beginilah cara saya melakukannya:
sumber
Saya tahu ini sudah tua, tapi ...
sumber
Saya membuat fungsi yang lebih mirip dengan substr, dan menggunakan ide @Dave.
Ps .: Pemotongan panjang penuh mungkin kurang dari substr.
sumber
Menambahkan pernyataan IF / ELSEIF ke kode dari Dave dan AmalMurali untuk menangani string tanpa spasi
sumber
Saya menemukan ini berfungsi:
function singkatanate_string_to_whole_word ($ string, $ max_length, $ buffer) {
}
Buffer memungkinkan Anda untuk menyesuaikan panjang string yang dikembalikan.
sumber
Gunakan ini:
kode berikut akan menghapus ','. Jika Anda memiliki karakter atau sub-string lain, Anda dapat menggunakannya sebagai ganti ','
// jika Anda memiliki akun string lain untuk
sumber
Meskipun ini adalah pertanyaan yang agak lama, saya pikir saya akan memberikan alternatif, karena tidak disebutkan dan valid untuk PHP 4.3+.
Anda dapat menggunakan
sprintf
kumpulan fungsi untuk memotong teks, dengan menggunakan%.ℕs
pengubah presisi.Pemotongan Sederhana https://3v4l.org/QJDJU
Hasil
Pemotongan Diperluas https://3v4l.org/FCD21
Karena
sprintf
fungsinya mirip dengansubstr
dan sebagian akan memotong kata-kata. Pendekatan di bawah ini akan memastikan kata-kata tidak terputus dengan menggunakanstrpos(wordwrap(..., '[break]'), '[break]')
pembatas khusus. Ini memungkinkan kami untuk mengambil posisi dan memastikan kami tidak cocok dengan struktur kalimat standar.Mengembalikan string tanpa memotong sebagian kata dan itu tidak melebihi lebar yang ditentukan, sambil mempertahankan jeda baris jika diinginkan.
Hasil
Hasil menggunakan
wordwrap($string, $width)
ataustrtok(wordwrap($string, $width), "\n")
sumber
Saya menggunakan ini sebelumnya
sumber
Di sini Anda dapat mencoba ini
sumber
Saya percaya ini adalah cara termudah untuk melakukannya:
Saya menggunakan karakter khusus untuk membagi teks dan memotongnya.
sumber
Mungkin ini akan membantu seseorang:
sumber