374 votes

Tronquer une chaîne de caractères aux n premiers caractères d'une chaîne et ajouter trois points si des caractères sont supprimés.

Comment obtenir les n premiers caractères d'une chaîne de caractères en PHP ? Quel est le moyen le plus rapide de réduire une chaîne de caractères à un nombre spécifique de caractères, et d'ajouter '...' si nécessaire ?

6 votes

Il serait peut-être préférable d'utiliser le caractère d'ellipse

1 votes

Jetez un coup d'œil à ma réponse si vous voulez éviter les coupures de mots.

0 votes

662voto

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

Mise à jour :

Sur la base de la suggestion de vérifier la longueur (et aussi de s'assurer que les longueurs sont similaires sur les cordes taillées et non taillées) :

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

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

Mise à jour 2 :

Ou en tant que 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 évite de casser la chaîne au milieu d'un mot en utilisant la fonction wordwrap fonction :

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

19 votes

Il serait peut-être préférable de remplacer par des points de suspension ( ... ) plutôt que par 3 points ( ... )

3 votes

J'adore cette méthode, mais je l'ai modifiée et j'utilise ce qui suit pour supprimer les espaces à la fin : $string = substr(trim($string),0,10).'...' ; De cette façon, vous obtenez quelque chose comme "J'aime..." au lieu de "J'aime ...".

39 votes

"hellip" - il m'a fallu du temps pour comprendre que nous ne parlions pas de l'adresse IP de satan

152voto

bruchowski Points 1048

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...

Il convient de noter que le trimmarker (l'ellipse ci-dessus) sont inclus dans la longueur tronquée.

1 votes

Dan, vous devriez peut-être être un peu plus précis sur la partie de la réponse du haut qui n'a pas fonctionné pour vous. La fonction truncate() a parfaitement fonctionné pour moi et l'avantage de cette réponse par rapport à celle de Bruchowski est qu'elle s'arrête aux frontières des mots, en supposant que vous vous souciez de ce genre de choses.

1 votes

La meilleure réponse (pour l'instant) ( stackoverflow.com/a/3161830/236306 ) n'a rien donné (comme si je n'avais pas utilisé la touche fn). Je ne sais pas pourquoi. Cette réponse semble toutefois parfaite et présente l'avantage supplémentaire de fonctionner.

2 votes

Remarque : si vous utilisez Laravel, il existe une fonction d'encapsulation str_limit() qui est similaire à cette réponse : return rtrim(mb_strimwidth($value, 0, $limit, '', 'UTF-8')).$end

15voto

Emil Vikström Points 42251

L'extension Multibyte peut s'avérer utile si vous avez besoin de contrôler le jeu de caractères de la chaîne.

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

0 votes

Ce code ajoute les trois points à la chaîne de caractères ? mon code a une balise de lien <a> et lorsque je le lie, il le lie avec les trois points, ce qui donne une valeur différente.

11voto

MortalViews Points 467

Parfois, vous devez limiter la chaîne au dernier mot complet, c'est-à-dire que vous ne voulez pas que le dernier mot soit interrompu, mais que vous vous arrêtiez à l'avant-dernier mot.

eg : 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 sauterons les lettres interrompues dans le dernier mot.

phew, je suis mauvais pour 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;
    }

}

8voto

Matthew Points 4216

Le framework codeigniter contient une aide pour cela, appelée "text helper". Voici un extrait du guide d'utilisation 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 en rapport avec 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;
            }       
        }
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X