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 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] . '...';
À 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")
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),' ')."...");
C'est la solution la plus simple que je connaisse...
substr($string,0,strrpos(substr($string,0,28),' ')).'...';
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), " "));
?>
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.
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.
, 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?'...':'');
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;
}
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| )+/"," ",$string, -1); // replace   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
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é...
pourquoi ne pas essayer d'exploser, et que les 4 premiers éléments du tableau?