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 en un nombre spécifique de caractères et d'ajouter "..." si nécessaire?
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 de casser la chaîne au milieu d'un mot en utilisant la wordwrapfonction:
pourrait être préférable de remplacer par des points de suspension (…) plutôt que 3 points (...)
Keet
3
J'adore cela, mais je l'ai changé 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 ...".
Kenton de Jong
28
"hellip" - m'a pris un certain temps pour comprendre que nous ne parlions pas de l'adresse IP de satan
Lucas Bernardo de Sousa
2
La mise à jour 3 est la plus utile.
milkovsky
Dans le cas où il y a un plafond dur sur la longueur de la chaîne retournée, la ligne 5 de la mise à jour 3 ne devrait-elle pas être $string = wordwrap($string, $length - sizeof($append)); ?
Michael Crenshaw
115
Cette fonctionnalité est intégrée à PHP depuis la version 4.0.6. Voir les documents .
A parfaitement fonctionné pour moi. La meilleure réponse n'a pas fonctionné, et je suis content que ce ne soit pas le cas, car j'ai continué à faire défiler et trouvé ce joyau.
Eduardo
Merci, j'ai toujours utilisé cette méthode plus longue et plus ancienne!
gr3g
1
Dan, vous voudrez peut-être être un peu plus précis sur la partie de la première réponse qui ne vous convient pas. La fonction truncate () a parfaitement fonctionné pour moi et l'avantage de cette réponse sur la réponse de bruchowski est qu'elle se casse sur les limites des mots; en supposant que vous vous souciez de ce genre de chose.
pdwalker
2
bonne prise! de nombreux développeurs PHP expérimentés ne connaissent pas cette fonction :)
jroi_web
1
La réponse du haut (en ce moment) ( stackoverflow.com/a/3161830/236306 ) n'a rien fait (comme si je n'avais pas du tout utilisé le fn). Je ne sais pas pourquoi. Cette réponse semble cependant parfaite et est venue avec l'avantage supplémentaire de travailler.
Alan
15
L'extension multi-octets peut être 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).'...';}
Ce code ajoute les trois points à la chaîne? mon code il a une balise de lien <a> et quand je le lierai il le liera ensemble avec les trois points dont il viendra comme une valeur différente.
fello
9
parfois, vous devez limiter la chaîne au dernier mot complet, c'est-à-dire: vous ne voulez pas que le dernier mot soit rompu, vous vous arrêtez avec l'avant-dernier mot.
par exemple: nous devons limiter "This is my String" à 6 caractères mais au lieu de "This i ..." nous voulons qu'il soit "This ..." c'est-à-dire que nous ignorerons les lettres cassées dans le dernier mot.
si $ str est plus court que $ n_chars, le retourne intact.
Si $ str est égal à $ n_chars, il le retourne tel quel également.
si $ str est plus long que $ n_chars, alors il recherche l'espace suivant à couper ou (s'il n'y a plus d'espace jusqu'à la fin) $ str est coupé grossièrement à la place à $ n_chars.
REMARQUE: sachez que cette méthode supprimera toutes les balises en cas de code HTML.
Le framework de codeigniter contient une aide pour cela, appelée "aide 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:
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 simplement la fonction avec chaîne et limite ,
par exemple: str_short("hahahahahah",5);
il coupera votre chaîne et ajoutera "..." à la fin
:)
Pour créer dans une fonction (pour une utilisation répétée) 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,'..');
Pourrait expliquer pourquoi cette approche est la meilleure au lieu de simplement affirmer qu'elle l'est?
Robert
1
@Robert c'est simple, et l'abstrait signifie que vous n'avez pas à retaper le code encore et encore. Et surtout, si vous trouvez une meilleure façon de le faire ou si vous voulez quelque chose de plus complexe, vous ne modifiez que cette 1 fonction au lieu de 50 morceaux de code.
TravisO
2
Pourquoi la fonction est-elle en majuscules?
Carlo
Correction: substr de $ var, pas $ string. Testez contre $limit + 3afin de ne pas couper une chaîne juste au - dessus de la limite. En fonction de votre application (par exemple, la sortie HTML), pensez à utiliser une entité à la …place (typiquement plus agréable). Comme suggéré précédemment, coupez toutes les non-lettres de la fin de la chaîne (raccourcie) avant d'ajouter les points de suspension. Enfin, faites attention si vous êtes dans un environnement multi-octets (par exemple, UTF-8) - vous ne pouvez pas utiliser strlen () et substr ().
Phil Perry
1
Je ne sais pas si c'est la solution la plus rapide, mais il semble que ce soit la plus courte:
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 des fonctions mb_ afin que cela fonctionne pour toutes les langues comme l'arabe
S'il n'y a aucune exigence stricte sur la longueur de la chaîne tronquée, on peut l'utiliser pour tronquer et empêcher également de couper le dernier mot:
$text ="Knowledge is a natural right of every human being of which no one
has the right to deprive him or her under any pretext, except in a case where a
person does something which deprives him or her of that right. It is mere
stupidity to leave its benefits to certain individuals and teams who monopolize
these while the masses provide the facilities and pay the expenses for the
establishment of public sports.";// we don't want new lines in our preview
$text_only_spaces = preg_replace('/\s+/',' ', $text);// truncates the text
$text_truncated = mb_substr($text_only_spaces,0, mb_strpos($text_only_spaces," ",50));// prevents last word truncation
$preview = trim(mb_substr($text_truncated,0, mb_strrpos($text_truncated," ")));
Dans ce cas, $previewsera "Knowledge is a natural right of every human being".
Réponses:
Mettre à jour:
Basé sur une suggestion pour vérifier la longueur (et également garantir des longueurs similaires sur les cordes coupées et non coupées):
Vous obtiendrez donc 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:
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 de casser la chaîne au milieu d'un mot en utilisant la
wordwrap
fonction:la source
$string = wordwrap($string, $length - sizeof($append));
?Cette fonctionnalité est intégrée à PHP depuis la version 4.0.6. Voir les documents .
Notez que les
trimmarker
(les points de suspension ci-dessus) sont inclus dans la longueur tronquée.la source
L'extension multi-octets peut être utile si vous avez besoin de contrôler le jeu de caractères de la chaîne.
la source
parfois, vous devez limiter la chaîne au dernier mot complet, c'est-à-dire: vous ne voulez pas que le dernier mot soit rompu, vous vous arrêtez avec l'avant-dernier mot.
par exemple: nous devons limiter "This is my String" à 6 caractères mais au lieu de "This i ..." nous voulons qu'il soit "This ..." c'est-à-dire que nous ignorerons les lettres cassées dans le dernier mot.
ouf, je suis mal à expliquer, voici le code.
la source
Si vous voulez couper en faisant attention à ne pas diviser les mots, vous pouvez faire ce qui suit
si $ str est plus court que $ n_chars, le retourne intact.
Si $ str est égal à $ n_chars, il le retourne tel quel également.
si $ str est plus long que $ n_chars, alors il recherche l'espace suivant à couper ou (s'il n'y a plus d'espace jusqu'à la fin) $ str est coupé grossièrement à la place à $ n_chars.
REMARQUE: sachez que cette méthode supprimera toutes les balises en cas de code HTML.
la source
Le framework de codeigniter contient une aide pour cela, appelée "aide 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:
Et
la source
Utiliser une sous-chaîne
http://php.net/manual/en/function.substr.php
la source
la source
La fonction que j'ai utilisée:
Voyez-le en action .
la source
C'est ce que je fais
où $ num représente le nombre de caractères et $ tt la chaîne pour la manipulation.
la source
J'ai développé une fonction pour cet usage
vous appelez simplement la fonction avec chaîne et limite ,
par exemple:
str_short("hahahahahah",5)
;il coupera votre chaîne et ajoutera "..." à la fin
:)
la source
Pour créer dans une fonction (pour une utilisation répétée) et une longueur limitée dynamique, utilisez:
la source
Il est préférable de résumer votre code comme ceci (notez que la limite est facultative et par défaut à 10):
la source
$limit + 3
afin de ne pas couper une chaîne juste au - dessus de la limite. En fonction de votre application (par exemple, la sortie HTML), pensez à utiliser une entité à la…
place (typiquement plus agréable). Comme suggéré précédemment, coupez toutes les non-lettres de la fin de la chaîne (raccourcie) avant d'ajouter les points de suspension. Enfin, faites attention si vous êtes dans un environnement multi-octets (par exemple, UTF-8) - vous ne pouvez pas utiliser strlen () et substr ().Je ne sais pas si c'est la solution la plus rapide, mais il semble que ce soit la plus courte:
PS Voir quelques exemples ici https://stackoverflow.com/a/17852480/131337
la source
substr () serait le meilleur, vous voudrez également vérifier la longueur de la chaîne en premier
WordWrap ne coupe pas la chaîne, il suffit de la diviser ...
la source
$ width = 10;
ou avec un wordwrap
la source
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 des fonctions mb_ afin que cela fonctionne pour toutes les langues comme l'arabe
la source
la source
S'il n'y a aucune exigence stricte sur la longueur de la chaîne tronquée, on peut l'utiliser pour tronquer et empêcher également de couper le dernier mot:
Dans ce cas,
$preview
sera"Knowledge is a natural right of every human being"
.Exemple de code en direct: http://sandbox.onlinephpfunctions.com/code/25484a8b687d1f5ad93f62082b6379662a6b4713
la source