Je ne suis pas très doué pour la manipulation de chaînes en JavaScript, et je me demandais comment vous feriez pour raccourcir une chaîne sans couper aucun mot. Je sais comment utiliser substring, mais pas indexOf ou quoi que ce soit vraiment bien.
Disons que j'avais la chaîne suivante:
text = "this is a long string I cant display"
Je veux le réduire à 10 caractères, mais s'il ne se termine pas par un espace, terminez le mot. Je ne veux pas que la variable de chaîne ressemble à ceci:
"c'est une longue chaîne que je ne peux pas dis"
Je veux qu'il termine le mot jusqu'à ce qu'un espace apparaisse.
javascript
string
substring
Josh Bedo
la source
la source
" too many spaces ".trim()
Réponses:
Si je comprends bien, vous voulez raccourcir une chaîne à une certaine longueur (par exemple raccourcir
"The quick brown fox jumps over the lazy dog"
à, disons, 6 caractères sans couper aucun mot).Si tel est le cas, vous pouvez essayer quelque chose comme ce qui suit:
la source
maxLength + 1
), mais je l'ai corrigé en ajoutant simplement cette ligne en haut:var yourString += " ";
fox jumps over the lazy dog
partie, le résultat seraThe quick brown
, quand il devrait l'êtreThe quick brown fox
.Il existe de nombreuses façons de le faire, mais une expression régulière est une méthode d'une ligne utile:
Cette expression renvoie les 11 premiers caractères (tous) plus tous les caractères non espace suivants.
Exemple de script:
Production:
la source
t.replace(new RegExp("^(.{"+length+"}[^\s]*).*"), "$1")
{30}
Je suis un peu surpris que pour un problème simple comme celui-ci, il y ait tant de réponses difficiles à lire et certaines, y compris celle choisie, ne fonctionnent pas.
Je veux généralement que la chaîne de résultat soit au maximum des
maxLen
caractères. J'utilise également cette même fonction pour raccourcir les slugs dans les URL.str.lastIndexOf(searchValue[, fromIndex])
prend un deuxième paramètre qui est l'index à partir duquel commencer la recherche en arrière dans la chaîne, ce qui rend les choses efficaces et simples.Ceci est un exemple de sortie:
Et pour la limace:
la source
str
estundefined
. J'ai ajoutéif (!str || str.length <= maxLen) return str;
str.length <= maxLen
. Sinon, il renvoie une chaîne vide.Tout le monde semble oublier que indexOf prend deux arguments: la chaîne à rechercher et l'index de caractère à partir duquel commencer la recherche. Vous pouvez couper la chaîne au premier espace après 10 caractères.
la source
Lodash a une fonction spécialement écrite pour cela:
_.truncate
la source
Basé sur la réponse NT3RP qui ne gère pas certains cas de coin, j'ai créé ce code. Il garantit de ne pas renvoyer un texte avec un événement size> maxLength, une ellipse a
...
été ajoutée à la fin.Cela gère également certains cas d'angle comme un texte dont un seul mot est> maxLength
Je suppose que vous pouvez facilement supprimer la dépendance jquery si cela vous dérange.
la source
$.extend
être passés pour être inversés?Voici une solution en une ligne.
la source
Je suis en retard à la fête, mais voici une petite solution simple que j'ai trouvée pour renvoyer un certain nombre de mots.
Ce n'est pas directement lié à votre exigence de personnages , mais cela sert le même résultat que je crois que vous recherchiez.
Voir l'exemple de travail ici: https://jsfiddle.net/bx7rojgL/
la source
Cela exclut le dernier mot au lieu de l'inclure.
Usage:
la source
J'ai adopté une approche différente. Alors que j'avais besoin d'un résultat similaire, je voulais garder ma valeur de retour inférieure à la longueur spécifiée.
Edit Je l'ai un peu remanié ici: Exemple JSFiddle . Il rejoint le tableau d'origine au lieu de concaténer.
la source
Afficher l'extrait de code
la source
Vous pouvez utiliser
truncate
une seule ligne ci-dessous:la source
}
var s = "c'est une longue chaîne et je ne peux pas tout expliquer"; raccourcir (s, 10, '...')
/* "c'est .." */
la source
Voici encore un autre morceau de code qui tronque le long des signes de ponctuation (recherchait ceci et Google a trouvé cette question ici). J'ai dû trouver une solution par moi-même, c'est donc ce que j'ai piraté en 15 minutes. Recherche toutes les occurrences de. ! ? et tronque à n'importe quelle position de ceux-ci qui est <que
len
la source
Typographie, et avec des ellipses :)
la source
'Pâtes aux tomates et épinards'
si vous ne voulez pas couper le mot en deux
première itération:
acc: 0 / acc + cur.length = 5 / newTitle = ['Pâtes'];
deuxième itération:
acc: 5 / acc + cur.length = 9 / newTitle = ['Pâtes', 'avec'];
troisième itération:
acc: 9 / acc + cur.length = 15 / newTitle = ['Pâtes', 'avec', 'tomate'];
quatrième itération:
acc: 15 / acc + cur.length = 18 (limite limite) / newTitle = ['Pâtes', 'avec', 'tomate'];
sortie: Pâtes à la tomate ...
la source
Pour ce que ça vaut, j'ai écrit ceci pour tronquer à la limite du mot sans laisser de ponctuation ou d'espaces à la fin de la chaîne:
la source
Je n'ai pas trouvé les solutions votées satisfaisantes. J'ai donc écrit quelque chose qui est un peu générique et fonctionne à la fois la première et la dernière partie de votre texte (quelque chose comme substr mais pour les mots). Vous pouvez également définir si vous souhaitez que les espaces soient omis dans le nombre de caractères.
la source
Je suis arrivé en retard pour cela mais je pense que cette fonction fait exactement ce que l'OP demande. Vous pouvez facilement modifier les valeurs SENTENCE et LIMIT pour différents résultats.
La sortie de cet extrait de code est où la LIMITE est 11 est:
la source
Avec des conditions aux limites comme une phrase vide et un premier mot très long. En outre, il n'utilise aucune chaîne api / bibliothèque spécifique au langage.
la source
Vous pouvez couper les espaces avec ceci:
la source
Mis à jour à partir de @ NT3RP, j'ai trouvé que si la chaîne frappe un espace pour la première fois, elle finira par supprimer ce mot, ce qui rendra votre chaîne un mot plus courte qu'elle ne peut l'être. J'ai donc simplement ajouté une instruction if else pour vérifier que maxLength ne tombe pas sur un espace.
codepen.io
la source