Bir dizenin ilk n karakterini al


320

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?


5
üç nokta karakterini kullanmak daha iyi olabilir…
Keet

1
kelimeleri kesmekten kaçınmanız gerekiyorsa cevabımı kontrol edin.
TechNyquist


Bu Bağlantıyı Deneyin, Size
Yardımcı Olabilir

Yanıtlar:


578
//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;
}

11
3 nokta yerine üç nokta (…) ile değiştirmek en iyisi olabilir (...)
Keet

3
Bunu seviyorum, ama değiştirdim ve sonunda boşluk kaldırmak için aşağıdaki kullanın: $ string = substr (trim ($ string), 0,10) .'... '; Bu şekilde "Seviyorum ..." yerine "Seviyorum ..." gibi bir şey alırsınız.
Kenton de Jong

28
"hellip" - şeytanın ip adresi hakkında konuşmadığımızı anlamak için bir ara götürdüm
Lucas Bernardo de Sousa

2
Güncelleme 3 en faydalı olanıdır.
milkovsky

Döndürülen dizenin uzunluğunda sabit bir kapak varsa, güncelleştirme 3'ün 5. satırı olmamalı $string = wordwrap($string, $length - sizeof($append)); mı?
Michael Crenshaw

115

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.


4
Benim için mükemmel çalıştı. Üst cevap işe yaramadı ve kaydırma tuttu ve bu taş bulundu çünkü o did sevindim.
Eduardo

Teşekkür ederim, bu uzun ve eski yöntemi her zaman kullandım!
gr3g

1
Dan, en iyi cevabın hangi kısmının sizin için işe yaramadığı konusunda biraz daha spesifik olmak isteyebilirsiniz. Truncate () işlevi benim için mükemmel çalıştı ve bu cevabın bruchowski'nin cevabı üzerindeki avantajı, kelime sınırlarını aşması; bu tür şeyleri önemsediğinizi varsayarsak.
pdwalker

2
İyi yakalama! birçok deneyimli PHP geliştiricisi bu işlevi bilmiyor :)
jroi_web

1
Üst (şimdi) cevap ( stackoverflow.com/a/3161830/236306 ) hiçbir şey yapmadı (sanki fn'i hiç kullanmamışım gibi). Neden bilmiyorum. Ancak bu cevap mükemmel görünüyor ve çalışmanın ek yararı ile geldi.
Alan

15

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) . '...';
}

Bu kod dizeye üç nokta ekliyor? kodumda bir bağlantı etiketi var <a> ve onu bağladığımda farklı bir değer olarak gelecek üç nokta ile birleştirecek.
merhaba

9

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;
    }

}

9

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.


8

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 = '&#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;
    }
}

Ve

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;
            }       
        }
    }
}


3
if(strlen($text) > 10)
     $text = substr($text,0,10) . "...";

Yukarıdaki @Brendon Bullen'den .. $ string = (strlen ($ string)> 13)? substr ($ string, 0,10) .'... ': $ string; Güzel !
MarcoZen

1

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 .


1

Bu benim işim

    function cutat($num, $tt){
        if (mb_strlen($tt)>$num){
            $tt=mb_substr($tt,0,$num-2).'...';
        }
        return $tt;
    }

burada $ num karakter sayısını ve $ tt dizgiyi manipülasyon için temsil eder.


1

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


1

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, '..');

1

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;
    }
}

1
Trim () zaten mevcut olduğu için çalışmaz .
Gordon

Bu yaklaşımın neden olduğunu iddia etmek yerine neden en iyi olduğunu açıklayabilir misiniz?
Robert

1
@Robert basittir ve soyutlama, kodu tekrar tekrar yazmanız gerekmediği anlamına gelir. Ve en önemlisi, bunu yapmanın daha iyi bir yolunu bulursanız veya daha karmaşık bir şey istiyorsanız, 50 kod parçası yerine bu 1 işlevini değiştirirsiniz.
TravisO

2
İşlev neden büyük harf?
Carlo

Düzeltme: $ var alt dizesi $ var, $ string değil. $limit + 3Bir dizeyi sınırın biraz üzerinde kesmemeniz için test edin. Uygulamanıza (ör. HTML çıktısı) bağlı olarak, &hellip;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.
Phil Perry


0

substr () en iyisi olur, önce dizenin uzunluğunu da kontrol etmek istersiniz

$str = 'someLongString';
$max = 7;

if(strlen($str) > $max) {
   $str = substr($str, 0, $max) . '...';
}

wordwrap ipi kesmez, sadece böler ...


0

$ width = 10;

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

veya wordwrap ile

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

0

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;
}

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;

0

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, $previewolacak"Knowledge is a natural right of every human being" .

Canlı kod örneği: http://sandbox.onlinephpfunctions.com/code/25484a8b687d1f5ad93f62082b6379662a6b4713

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.