Couper une chaîne après n caractères, mais si c'est au milieu d'un mot, couper le mot entier

J'essaie de créer une fonction JS qui coupe une chaîne après n caractères – cela fonctionne. Le problème est que si c'est au milieu d'un mot, il semble mauvais, alors j'ai besoin de votre aide pour faire couper le mot entier s'il en est le milieu.

Mon code jusqu'à présent:

if($('#desc').text().length > 505){ str = $("#desc").text(); $('#desc').text(str.substring(0, 505)).append('...'); } 

PS

  • #desc est le div qui contient ma chaîne.
  • Vous pouvez utiliser jQuery.

 function cut(n) { return function textCutter(i, text) { var short = text.substr(0, n); if (/^\S/.test(text.substr(n))) return short.replace(/\s+\S*$/, ""); return short; }; } $('#desc').text(cut(505)); 

La méthode lastIndexOf peut trouver le dernier caractère d'espace dans une chaîne,

Et passer un deuxième argument définit une limite supérieure.

 var cutat= string.lastIndexOf(' ',505); if(cutat!=-1)string=string.substring(0,cutat)+'...'; //else the string is shorter than 505 (or has no spaces...) 

C'est une combinaison d'une boucle for , charAt , et un moyen de tester le personnage contre ceux que vous considérez comme des délimiteurs de mots. Je vais utiliser une expression régulière pour cela:

 function splitString(str, index) { var delim = /\s|[,\.]/; // Put any other character you consider // a non-word char in the brackets. // The initial \s is any whitespace, so // space, tab, newline, etc. var ch; var i; // Loop until we find a matching delimiter or we run out of string for (i = index; i >= 0 && !delim.test(str.charAt(i)); --i) { // No body } if (i < 0) { // No break before, split word in middle return index; } return i + 1; } 

Exemple en direct | la source

Vous voudrez peut-être jeter un coup d'oeil à Cutter.js

Cutter.js est une bibliothèque utilisée pour tronquer le code HTML pour limiter sa longueur, par mot, sans perdre le balisage.

 function cutAt(text, n) { if(text.length > n){ for (; " .,".indexOf(text[n]) !== 0; n--){ } return text.substr(0, n) + '...'; } return text; } $('#desc').text(cutAt($('#desc').text(), 505));