14 votes

Comment obtenir les x premiers caractères d'une chaîne, sans couper le dernier mot ?

J'ai la chaîne suivante dans une variable.

Stack Overflow is as frictionless and painless to use as we could make it.

Je veux récupérer les 28 premiers caractères de la ligne ci-dessus, donc normalement si j'utilise substrat alors cela me donnera Stack Overflow is as frictio cette sortie mais je veux une sortie comme :

Stack Overflow is as...

Existe-t-il une fonction préétablie en PHP pour le faire, ou bien pouvez-vous me fournir un code pour cela en PHP ?

Édité :

Je veux un total de 28 caractères de la chaîne sans casser un mot, si cela me renvoie un peu moins de caractères que 28 sans casser un mot, c'est bien.

53voto

Greg Points 132247

Vous pouvez utiliser le wordwrap() puis explose sur newline et prend la première partie :

$str = wordwrap($str, 28);
$str = explode("\n", $str);
$str = $str[0] . '...';

11voto

John Kugelman Points 108754

De AlfaSky :

function addEllipsis($string, $length, $end='…')
{
    if (strlen($string) > $length)
    {
        $length -= strlen($end);
        $string  = substr($string, 0, $length);
        $string .= $end;
    }

    return $string;
}

Une autre mise en œuvre, plus riche en fonctionnalités, de Le blog d'Elliott Brueggeman :

/**
 * trims text to a space then adds ellipses if desired
 * @param string $input text to trim
 * @param int $length in characters to trim to
 * @param bool $ellipses if ellipses (...) are to be added
 * @param bool $strip_html if html tags are to be stripped
 * @return string 
 */
function trim_text($input, $length, $ellipses = true, $strip_html = true) {
    //strip tags, if desired
    if ($strip_html) {
        $input = strip_tags($input);
    }

    //no need to trim, already shorter than trim length
    if (strlen($input) <= $length) {
        return $input;
    }

    //find last space within length
    $last_space = strrpos(substr($input, 0, $length), ' ');
    $trimmed_text = substr($input, 0, $last_space);

    //add ellipses (...)
    if ($ellipses) {
        $trimmed_text .= '...';
    }

    return $trimmed_text;
}

(Recherche Google : "php trim ellipses")

3voto

Miky Dinescu Points 22380

Voici une façon de le faire :

$str = "Stack Overflow is as frictionless and painless to use as we could make it.";

$strMax = 28;
$strTrim = ((strlen($str) < $strMax-3) ? $str : substr($str, 0, $strMax-3)."...");

//or this way to trim to full words
$strFull = ((strlen($str) < $strMax-3) ? $str : strrpos(substr($str, 0, $strMax-3),' ')."...");

3voto

PachinSV Points 1707

C'est le moyen le plus simple :

<?php 
$title = "this is the title of my website!";
$number_of_characters = 15;
echo substr($title, 0, strrpos(substr($title, 0, $number_of_characters), " "));
?>

2voto

Travis Points 2231

C'est la solution la plus simple que je connaisse...

substr($string,0,strrpos(substr($string,0,28),' ')).'...';

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