PHP'de bir dizenin ilk n karakterini nasıl alabilirim? Bir dizeyi belirli sayıda karaktere kırpmanın ve gerekirse '...' eklemenin en hızlı yolu nedir?
PHP'de bir dizenin ilk n karakterini nasıl alabilirim? Bir dizeyi belirli sayıda karaktere kırpmanın ve gerekirse '...' eklemenin en hızlı yolu nedir?
Yanıtlar:
//The simple version for 10 Characters from the beginning of the string
$string = substr($string,0,10).'...';
Güncelleme:
Uzunluk kontrolü önerisine (ve ayrıca kesilmiş ve kırpılmamış tellerde benzer uzunlukların sağlanması) dayanarak:
$string = (strlen($string) > 13) ? substr($string,0,10).'...' : $string;
Böylece en fazla 13 karakterden oluşan bir dize alırsınız; 13 (veya daha az) normal karakter veya 10 karakter ve ardından '...'
Güncelleme 2:
Veya işlev olarak:
function truncate($string, $length, $dots = "...") {
return (strlen($string) > $length) ? substr($string, 0, $length - strlen($dots)) . $dots : $string;
}
Güncelleme 3:
Bu cevabı yazdığımdan beri bir süredir ve aslında bu kodu artık kullanmıyorum. Kullanarak bir kelimenin ortasında dize kırılmasını önler bu işlevi tercihwordwrap
:
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));
mı?
Bu işlevsellik, 4.0.6 sürümünden beri PHP'nin içine yerleştirilmiştir. Belgelere bakın .
echo mb_strimwidth('Hello World', 0, 10, '...');
// outputs Hello W...
Not, trimmarker
(yukarıdaki üç nokta) kesilmiş uzunluğu dahil edilir.
Dize karakter seti üzerinde denetime ihtiyacınız varsa Multibyte uzantısı kullanışlı olabilir.
$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) . '...';
}
bazen, dizeyi son tam sözcükle sınırlamanız gerekir; yani: son sözcüğün kırılmasını istemezsiniz, bunun yerine ikinci son sözcükle durursunuz.
örneğin: "Bu benim String'im" i 6 karakterle sınırlamamız gerekiyor, ancak 'This i ... "yerine' This ..." olmasını istiyoruz, yani son kelimedeki kırık harfleri atlayacağız.
vay, açıklamakta kötüyüm, işte kod.
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;
}
}
Kelimeleri bölmemek için dikkatli olmak istiyorsanız aşağıdakileri yapabilirsiniz
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;
}
$ str $ n_chars değerinden kısaysa, dokunulmadan döndürür.
$ Str $ n_chars değerine eşitse onu olduğu gibi döndürür.
$ str $ n_chars değerinden daha uzunsa, kesilecek bir sonraki alanı arar veya (sonuna kadar daha fazla boşluk yoksa) $ str bunun yerine $ n_chars yerine kaba bir şekilde kesilir.
NOT: HTML'de bu yöntemin tüm etiketleri kaldıracağını unutmayın.
Codeigniter çerçevesi, bunun için "metin yardımcısı" adı verilen bir yardımcı içerir. Aşağıda, geçerli kod düzenleyicinin kullanıcı kılavuzundan bazı dokümanlar verilmiştir: http://codeigniter.com/user_guide/helpers/text_helper.html (word_limiter ve character_limiter bölümlerini okuyun). Sorunuzla ilgili iki işlev şunlardır:
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;
}
}
Ve
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;
}
}
}
}
Kullandığım işlev:
function cutAfter($string, $len = 30, $append = '...') {
return (strlen($string) > $len) ?
substr($string, 0, $len - strlen($append)) . $append :
$string;
}
Hareket halinde görün .
Bu kullanım için bir işlev geliştirdim
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;
}
}
Sadece dizeyle işlevini çağırmak ve limite
örn: str_short("hahahahahah",5)
;
dizenizi kesecek ve sonunda "..." ekleyecektir
:)
Bir işlev içinde (tekrar kullanım için) ve dinamik sınırlı uzunluk içinde oluşturmak için şunu kullanın:
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, '..');
Kodunuzu soyutlamak en iyisidir (sınırın isteğe bağlı olduğunu ve varsayılan olarak 10 olduğunu unutmayın):
print limit($string);
function limit($var, $limit=10)
{
if ( strlen($var) > $limit )
{
return substr($string, 0, $limit) . '...';
}
else
{
return $var;
}
}
$limit + 3
Bir dizeyi sınırın biraz üzerinde kesmemeniz için test edin. Uygulamanıza (ör. HTML çıktısı) bağlı olarak, …
bunun yerine bir varlık kullanmayı düşünün (tipografik olarak daha hoş). Daha önce önerildiği gibi, üç nokta eklemeden önce (kısaltılmış) dizenin sonundaki harfleri kesin. Son olarak, çokbaytlı (ör. UTF-8) bir ortamda olup olmadığınıza dikkat edin - strlen () ve substr () kullanamazsınız.
Bunun en hızlı çözüm olup olmadığından emin değilim, ancak en kısa çözüm gibi görünüyor:
$result = current(explode("\n", wordwrap($str, $width, "...\n")));
PS Buradaki bazı örneklere bakın https://stackoverflow.com/a/17852480/131337
bu çözüm kelimeleri kesmeyecek, ilk boşluktan sonra üç nokta ekleyecektir. @ Raccoon29 çözümünü düzenledim ve tüm işlevleri mb_ işlevleriyle değiştirdim, böylece bu arapça gibi tüm diller için çalışacak
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;
Kesilen dizenin uzunluğu için zor bir gereksinim yoksa, son sözcüğü kesmek ve kesmek için bunu kullanabilirsiniz:
$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, " ")));
Bu durumda, $preview
olacak"Knowledge is a natural right of every human being"
.
Canlı kod örneği: http://sandbox.onlinephpfunctions.com/code/25484a8b687d1f5ad93f62082b6379662a6b4713