web-dev-qa-db-fra.com

Obtenir les n premiers caractères d'une chaîne

Comment puis-je obtenir les n premiers caractères d'une chaîne en PHP? Quel est le moyen le plus rapide de couper une chaîne à un nombre spécifique de caractères et d’ajouter "..." si nécessaire?

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

Mise à jour:

Sur la base de suggestions pour vérifier la longueur (et également pour assurer des longueurs similaires sur les chaînes coupées et non coupées):

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

Ainsi, vous obtiendrez une chaîne de 13 caractères maximum; soit 13 (ou moins) caractères normaux ou 10 caractères suivis de '...'

Mise à jour 2:

Ou comme fonction:

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

Mise à jour 3:

Cela fait un moment que j'ai écrit cette réponse et je n'utilise plus ce code. Je préfère cette fonction qui empêche la rupture de la chaîne au milieu d'un mot en utilisant la fonction wordwrap:

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;
}
551
Brendan Bullen

Cette fonctionnalité est intégrée à PHP depuis la version 4.0.6. Voir la documentation .

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

// outputs Hello W...

Notez que les trimmarker (les Ellipsis ci-dessus) sont inclus dans la longueur tronquée.

106
bruchowski

L'extension multi-octets peut s'avérer utile si vous avez besoin de contrôler le jeu de caractères 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) . '...';
}
15
Emil Vikström

parfois, vous devez limiter la chaîne au dernier mot complet, c'est-à-dire que vous ne voulez pas que le dernier mot soit brisé, mais que vous vous arrêtez au dernier dernier mot.

par exemple: nous devons limiter "This is my String" à 6 caractères, mais au lieu de "This i ...", nous voulons que ce soit "This ...", c'est-à-dire que nous ignorerons les lettres brisées dans le dernier mot.

ouf, j'ai du mal à expliquer, voici le code.

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
MortalViews

Si vous voulez couper en prenant soin de ne pas séparer les mots, vous pouvez procéder comme suit:

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

si $ str est plus court que $ n_chars le retourne intact.

Si $ str est égal à $ n_chars, il le retourne tel quel.

si $ str est plus long que $ n_chars, il cherche le prochain espace à couper ou (s'il n'y a plus d'espace jusqu'à la fin), $ str est coupé brutalement à la place de $ n_chars.

NOTE: sachez que cette méthode supprimera toutes les balises dans le cas de HTML.

8
TechNyquist

Le framework codeigniter contient pour cela une assistance, appelée "assistant de texte". Voici une documentation du guide de l'utilisateur de codeigniter qui s'applique: http://codeigniter.com/user_guide/helpers/text_helper.html (il suffit de lire les sections Word_limiter et character_limiter). Voici deux fonctions pertinentes pour votre question:

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

Et

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

Utiliser une sous-chaîne

http://php.net/manual/en/function.substr.php

$foo = substr("abcde",0, 3) . "...";
4
Dlongnecker
if(strlen($text) > 10)
     $text = substr($text,0,10) . "...";
3
HCL

Il est préférable d’abstraire votre code comme suit (notez que la limite est facultative et que la valeur par défaut est 10):

print limit($string);


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

Je ne suis pas sûr que ce soit la solution la plus rapide, mais il semble que ce soit la plus courte:

$result = current(explode("\n", wordwrap($str, $width, "...\n")));

P.S. Voir quelques exemples ici https://stackoverflow.com/a/17852480/131337

1
Sergiy Sokolenko

C'est ce que je fais

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

où $ num représente le nombre de caractères et $ tt la chaîne à manipuler.

1
christoz

Pour créer dans une fonction (pour un usage répété) et une longueur limitée dynamique, utilisez:

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
tfont

J'ai développé une fonction pour cet usage

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

vous appelez juste la fonction avec string et limite
Exemple: str_short("hahahahahah",5);
il coupera votre ficelle et ajoutera "..." à la fin
:)

1
Saikelu

La fonction que j'ai utilisée:

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

Voir en action .

1
Benjamin Crouzier
$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
Jaykishan

substr () serait préférable, vous voudrez également vérifier la longueur de la chaîne en premier

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

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

wordwrap ne coupe pas la chaîne, mais la scinde ...

0
tsgrasser

cette solution ne coupera pas les mots, elle ajoutera trois points après le premier espace. J'ai édité la solution @ Raccoon29 et j'ai remplacé toutes les fonctions par mb _ afin que cela fonctionne dans toutes les langues telles que l'arabe

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
Waqleh

$ width = 10;

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

ou avec wordwrap

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