Ottieni i primi n caratteri di una stringa


320

Come posso ottenere i primi n caratteri di una stringa in PHP? Qual è il modo più veloce per tagliare una stringa a un numero specifico di caratteri e aggiungere '...' se necessario?


5
potrebbe essere meglio usare il carattere di ellissi ...
Keet

1
controlla la mia risposta se hai bisogno di evitare il taglio delle parole.
TechNyquist,


Prova questo link, può aiutare a ... stackoverflow.com/a/26098951/3944217
edCoder

Risposte:


578
//The simple version for 10 Characters from the beginning of the string
$string = substr($string,0,10).'...';

Aggiornare:

Sulla base di suggerimenti per il controllo della lunghezza (e per garantire lunghezze simili su stringhe tagliate e non tagliate):

$string = (strlen($string) > 13) ? substr($string,0,10).'...' : $string;

Quindi otterrai una stringa di massimo 13 caratteri; 13 (o meno) caratteri normali o 10 caratteri seguiti da '...'

Aggiornamento 2:

O come funzione:

function truncate($string, $length, $dots = "...") {
    return (strlen($string) > $length) ? substr($string, 0, $length - strlen($dots)) . $dots : $string;
}

Aggiornamento 3:

È da un po 'che non scrivo questa risposta e non uso più questo codice. Preferisco questa funzione che impedisce di spezzare la stringa nel mezzo di una parola usando la wordwrapfunzione:

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
potrebbe essere meglio sostituire con i puntini di sospensione (...) anziché 3 punti (...)
Keet

3
Lo adoro, ma l'ho modificato e utilizzo quanto segue per rimuovere gli spazi bianchi alla fine: $ string = substr (trim ($ string), 0,10) .'... '; In questo modo ottieni qualcosa come "Mi piace ..." invece di "Mi piace ...".
Kenton de Jong,

28
"hellip" - mi ci è voluto un po 'di tempo per capire che non stavamo parlando dell'indirizzo IP di satana
Lucas Bernardo de Sousa,

2
L'aggiornamento 3 è il più utile.
milkovsky,

Nel caso in cui sia presente un limite massimo sulla lunghezza della stringa restituita, la riga 5 dell'aggiornamento 3 non dovrebbe essere $string = wordwrap($string, $length - sizeof($append)); ?
Michael Crenshaw,

115

Questa funzionalità è stata integrata in PHP dalla versione 4.0.6. Vedi i documenti .

echo mb_strimwidth('Hello World', 0, 10, '...');

// outputs Hello W...

Si noti che i trimmarker(puntini di sospensione sopra) sono inclusi nella lunghezza troncata.


4
Ha funzionato perfettamente per me. La risposta migliore non ha funzionato e sono contento che non abbia funzionato perché continuava a scorrere e ho trovato questo gioiello.
Eduardo,

Grazie, ho sempre usato questo metodo più lungo e più vecchio!
gr3g

1
Dan, potresti voler essere un po 'più specifico su quale parte della risposta principale non ha funzionato per te. La funzione truncate () ha funzionato perfettamente per me e il vantaggio di quella risposta sulla risposta di Bruchowski è che si rompe sui confini delle parole; supponendo che ti interessi di questo genere di cose.
pdwalker,

2
buona pesca! molti sviluppatori PHP esperti non conoscono questa funzione :)
jroi_web

1
La risposta principale (in questo momento) ( stackoverflow.com/a/3161830/236306 ) non ha fatto nulla (come se non avessi usato affatto il fn). Non so perché. Questa risposta, tuttavia, sembra perfetta e ha avuto l'ulteriore vantaggio di lavorare.
Alan,

15

L'estensione Multibyte può tornare utile se è necessario il controllo del set di stringhe.

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

Questo codice sta aggiungendo i tre punti alla stringa? il mio codice ha un tag di collegamento <a> e quando lo collego lo collegherà con i tre punti che verranno forniti con un valore diverso.
fello,

9

a volte, devi limitare la stringa all'ultima parola completa, ovvero: non vuoi che l'ultima parola sia spezzata, ma ti fermi con la seconda ultima parola.

ad esempio: dobbiamo limitare "Questa è la mia stringa" a 6 caratteri ma invece di "Questo io ..." vogliamo che sia "Questo ...", cioè salteremo le lettere rotte nell'ultima parola.

cavolo, sono cattivo a spiegare, ecco il codice.

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

Se vuoi tagliare facendo attenzione a non dividere le parole puoi fare quanto segue

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

se $ str è più corto di $ n_chars lo restituisce intatto.

Se $ str è uguale a $ n_chars lo restituisce pure.

se $ str è più lungo di $ n_chars, cerca lo spazio successivo da tagliare o (se non ci sono più spazi fino alla fine) $ str viene tagliato bruscamente invece di $ n_chars.

NOTA: tenere presente che questo metodo rimuoverà tutti i tag in caso di HTML.


8

Il framework codeigniter contiene un helper per questo, chiamato "text helper". Ecco un po 'di documentazione dalla guida per l'utente di codeigniter che si applica: http://codeigniter.com/user_guide/helpers/text_helper.html (basta leggere le sezioni word_limiter e character_limiter). Ecco due funzioni pertinenti alla tua domanda:

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

E

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) . "...";

Da @Brendon Bullen sopra .. $ string = (strlen ($ string)> 13)? substr ($ stringa, 0,10) .'... ': $ stringa; Bello !
MarcoZen,

1

La funzione che ho usato:

function cutAfter($string, $len = 30, $append = '...') {
        return (strlen($string) > $len) ? 
          substr($string, 0, $len - strlen($append)) . $append : 
          $string;
}

Guardalo in azione .


1

Questo è ciò che faccio

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

dove $ num sta per numero di caratteri e $ tt la stringa per manipolazione.


1

Ho sviluppato una funzione per questo uso

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

basta chiamare la funzione con lo spago e limite
ad esempio: str_short("hahahahahah",5);
taglierà la tua stringa e aggiungerà "..." alla fine
:)


1

Per creare all'interno di una funzione (per un uso ripetuto) e una lunghezza dinamica limitata, utilizzare:

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

È meglio astrarre il codice in questo modo (notare che il limite è facoltativo e il valore predefinito è 10):

print limit($string);


function limit($var, $limit=10)
{
    if ( strlen($var) > $limit )
    {
        return substr($string, 0, $limit) . '...';
    }
    else
    {
        return $var;
    }
}

1
Non funzionerà perché trim () esiste già.
Gordon,

Potrebbe spiegare perché questo approccio è il migliore invece di affermarlo?
Robert,

1
@Robert è semplice e astrarre significa che non è necessario ripetere la ripetizione del codice. E, soprattutto, se trovi un modo migliore per farlo, o vuoi qualcosa di più complesso, cambi solo questa funzione 1 invece di 50 pezzi di codice.
TravisO,

2
Perché la funzione è maiuscola?
Carlo

Correzione: substr di $ var, non $ string. Prova contro in $limit + 3modo da non tagliare una corda appena oltre il limite. A seconda dell'applicazione (ad es. Output HTML), considera invece l'utilizzo di un'entità &hellip;(tipograficamente più gradevole). Come suggerito in precedenza, tagliare tutte le non lettere dalla fine della stringa (abbreviata) prima di aggiungere i puntini di sospensione. Infine, fai attenzione se ti trovi in ​​un ambiente multibyte (ad es. UTF-8) - non puoi usare strlen () e substr ().
Phil Perry,


0

substr () sarebbe la cosa migliore, ti consigliamo di controllare prima la lunghezza della stringa

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

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

il wordwrap non ridurrà la stringa, ma la dividerà ...


0

$ larghezza = 10;

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

o con wordwrap

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

0

questa soluzione non taglierà le parole, aggiungerà tre punti dopo il primo spazio. Ho modificato la soluzione @ Raccoon29 e ho sostituito tutte le funzioni con le funzioni mb_ in modo che funzionasse per tutte le lingue come l'arabo

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

Se non vi sono requisiti rigidi sulla lunghezza della stringa troncata, è possibile utilizzarla per troncare e impedire anche il taglio dell'ultima parola:

$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, " ")));

In questo caso, $previewlo sarà "Knowledge is a natural right of every human being".

Esempio di codice live: http://sandbox.onlinephpfunctions.com/code/25484a8b687d1f5ad93f62082b6379662a6b4713

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.