Comment obtenir des 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 premiers 28 caractères de la ligne ci-dessus, donc normalement si j'utilise substr alors il me donnera Stack Overflow is as frictio cette sortie mais je veux sortie comme:

Stack Overflow is as...

y a-t-il une fonction pré-créée dans PHP pour le faire, ou s'il vous plaît me fournir du code pour cela en PHP?

Édité:

je veux un total de 28 caractères de la chaîne sans casser un mot, si elle me rendra peu moins de caractères que 28 sans casser un mot, c'est très bien.

13
demandé sur Prashant 2009-07-09 18:39:28

13 réponses

vous pouvez utiliser la fonction wordwrap() , puis exploser sur newline et prendre la première partie:

$str = wordwrap($str, 28);
$str = explode("\n", $str);
$str = $str[0] . '...';
50
répondu Greg 2009-07-09 14:42:25

À Partir De AlfaSky :

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

    return $string;
}

Un autre, plus plein de fonctionnalités de mise en œuvre de Elliott Brueggeman blog :

/**
 * 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 garniture ellipses")

10
répondu John Kugelman 2009-07-09 14:42:16

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),' ')."...");
3
répondu Mike Dinescu 2009-07-09 14:42:19

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

substr($string,0,strrpos(substr($string,0,28),' ')).'...';
2
répondu Travis 2009-07-09 14:45:52

C'est la voie la plus facile:

<?php 
$title = "this is the title of my website!";
$number_of_characters = 15;
echo substr($title, 0, strrpos(substr($title, 0, $number_of_characters), " "));
?>
2
répondu PachinSV 2012-05-08 20:14:05

j'utiliserais un tokenizer de chaîne de caractères pour diviser la chaîne en mots semblables:

$string = "Stack Overflow is as frictionless and painless to use as we could make it.";
$tokenized_string = strtok($string, " ");

alors vous pouvez retirer les mots individuels comme vous voulez.


Edit: Greg a une façon bien meilleure et plus élégante de faire ce que vous voulez. Je voudrais aller avec son wordwrap() solution.

0
répondu scheibk 2009-07-09 14:45:01

vous pouvez utiliser wordwrap .

string wordwrap  ( string $str  [, int $width= 75  [, string $break= "\n"  [, bool $cut= false  ]]] )

-

function firstNChars($str, $n) {
  return array_shift(explode("\n", wordwrap($str, $n)));
}

echo firstNChars("bla blah long string", 25) . "...";

avertissement: ne pas le tester.

de plus, si votre chaîne contient \n s, elle pourrait être cassée plus tôt.

0
répondu stefs 2009-07-09 14:48:27

, essayez:

$string='Stack Overflow is as frictionless and painless to use as we could make it.';
$n=28;
$break=strpos(wordwrap($string, $n,'<<||>>'),'<<||>>');
print substr($string,0,($break==0?strlen($string):$break)).(strlen($string)>$n?'...':'');

$string='Stack Overflow';
$n=28;
$break=strpos(wordwrap($string, $n,'<<||>>'),'<<||>>');
print substr($string,0,($break==0?strlen($string):$break)).(strlen($string)>$n?'...':'');
0
répondu KM. 2009-07-09 15:01:56
function truncate( $string, $limit, $break=" ", $pad="...") {

 // return with no change if string is shorter than $limit
 if(strlen($string) <= $limit){
    return $string;
 }

 $string = substr($string, 0, $limit);
 if(false !== ($breakpoint = strrpos($string, $break))){
    $string = substr($string, 0, $breakpoint);
 }
 return $string . $pad;
}
0
répondu David Morrow 2010-06-22 17:18:34

des problèmes peuvent se produire si votre chaîne de caractères a des balises html,   et des espaces multiples. Voici ce que j'utilise qui prend soin de tout:

function LimitText($string,$limit,$remove_html=0){
    if ($remove_html==1){$string=strip_tags($string);}
    $newstring = preg_replace("/(?:\s|&nbsp;)+/"," ",$string, -1); // replace &nbsp with space
    $newstring = preg_replace(array('/\s{2,}/','/[\t\n]/'),' ',$newstring); // replace duplicate spaces
    if (strlen($newstring)<=$limit) { return $newstring; } // ensure length is more than $limit
    $newstring = substr($newstring,0,strrpos(substr($newstring,0,$limit),' '));
    return $newstring;
}

utilisation:

$string = 'My wife is jealous of stackoverflow';
echo LimitText($string,20);
// My wife is jealous

utilisation avec html:

$string = '<div><p>My wife is jealous of stackoverflow</p></div>';
echo LimitText($string,20,1);
// My wife is jealous
0
répondu David D 2015-10-29 11:27:47

Ce Travail pour moi Parfait

function WordLimt($Keyword,$WordLimit){

    if (strlen($Keyword)<=$WordLimit) { return $Keyword; }
    $Keyword= substr($Keyword,0,strrpos(substr($Keyword,0,$WordLimit),' '));
    return $Keyword;
}

echo WordLimt($MyWords,28);

// OutPut : Stack Overflow is as

il s'ajustera et cassera sur le dernier espace sans mot coupé...

0
répondu Hitesh Aghara 2016-08-11 14:35:17

pourquoi ne pas essayer d'exploser, et que les 4 premiers éléments du tableau?

-1
répondu ghostdog74 2009-07-09 14:41:54
substr("some string", 0, x);

De la Manuel PHP

-1
répondu mcandre 2009-07-09 14:42:23