144 votes

Raccourcir une chaîne de caractères sans couper de mots en JavaScript

Je ne suis pas très doué pour la manipulation de chaînes de caractères en JavaScript, et je me demandais comment on pouvait raccourcir une chaîne de caractères sans couper de mot. Je sais comment utiliser substring, mais pas indexOf ou quoi que ce soit d'autre.

Supposons que je dispose de 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 chaîne ressemble à ceci :

"C'est une longue ficelle que je ne peux pas rompre.

Je veux qu'il termine le mot jusqu'à ce qu'un espace se produise.

2voto

clime Points 2431

Cela exclut le mot de la fin au lieu de l'inclure.

function smartTrim(str, length, delim, appendix) {
    if (str.length <= length) return str;

    var trimmedStr = str.substr(0, length+delim.length);

    var lastDelimIndex = trimmedStr.lastIndexOf(delim);
    if (lastDelimIndex >= 0) trimmedStr = trimmedStr.substr(0, lastDelimIndex);

    if (trimmedStr) trimmedStr += appendix;
    return trimmedStr;
}

Utilisation :

smartTrim(yourString, 11, ' ', ' ...')
"The quick ..."

2voto

Viktor Vlasenko Points 704

Vous pouvez utiliser truncate ci-dessous :

const text = "The string that I want to truncate!";

const truncate = (str, len) => str.substring(0, (str + ' ').lastIndexOf(' ', len));

console.log(truncate(text, 14));

2voto

doublejosh Points 974

Tapuscrit, et avec des ellipses :)

export const sliceByWord = (phrase: string, length: number, skipEllipses?: boolean): string => {
  if (phrase.length < length) return phrase
  else {
    let trimmed = phrase.slice(0, length)
    trimmed = trimmed.slice(0, Math.min(trimmed.length, trimmed.lastIndexOf(' ')))
    return skipEllipses ? trimmed : trimmed + '…'
  }
}

2voto

Trevor Robinson Points 3657

Voici une version en une ligne avec quelques propriétés utiles :

  1. Gère toute forme d'espace correspondant à l'option \s expressions rationnelles
  2. Les performances sont indépendantes de la longueur de l'entrée (tout ce qui dépasse la longueur maximale n'est pas analysé).
  3. Fonctionne indépendamment de la longueur de la sortie (analyse à rebours à partir de la longueur maximale et ne divise pas/joint la chaîne)

    s.length > maxLen ? s.substring(0, s.substring(0, maxLen + 1).search(/\s+\S*$/)) : s

2voto

Si vous utilisez (déjà) un lodash il existe une fonction appelée tronquer qui peut être utilisé pour couper la ficelle.

Basé sur l'exemple de la page de documentation

_.truncate('hi-diddly-ho there, neighborino', {
  'length': 24,
  'separator': ' '
});
// => 'hi-diddly-ho there,...'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X