805 votes

Convertir une chaîne en casse-titre avec JavaScript

Existe-t-il un moyen simple de convertir une chaîne de caractères en casse-titre ? Par exemple john smith devient John Smith . Je ne cherche pas quelque chose de compliqué comme La solution de John Resig juste (espérons-le) une sorte de phrase d'une ou deux lignes.

1 votes

Il y a plusieurs méthodes, avons-nous des statistiques de performance ?

1 votes

998voto

Greg Dean Points 12048

Essayez ça :

function toTitleCase(str) {
  return str.replace(
    /\w\S*/g,
    function(txt) {
      return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
    }
  );
}

<form>
  Input:
  <br /><textarea name="input" onchange="form.output.value=toTitleCase(this.value)" onkeyup="form.output.value=toTitleCase(this.value)"></textarea>
  <br />Output:
  <br /><textarea name="output" readonly onclick="select(this)"></textarea>
</form>

20 votes

Quelqu'un pourrait-il expliquer pourquoi \w\S* est utilisé, au lieu de \w+ o \w* par exemple ? Je ne sais pas pourquoi vous voudriez inclure autre chose que des espaces et donc changer Jim-Bob a Jim-bob .

5 votes

@martinCzerwi le \w\S* a également causé le Jim-bob problème de notre côté. Utilisation de \w* a résolu ce problème.

16 votes

/([^\W_]+[^\s-]*) */g résout le Jim-Bob problème, c'est-à-dire jim-bob --> Jim-Bob

344voto

Talha Ashfaque Points 443

Si une solution CSS répond à vos besoins, vous pouvez appliquer l'option text-transform Style CSS à vos contrôles :

text-transform: capitalize;

Sachez simplement que cela va se transformer :
hello world a Hello World
HELLO WORLD a HELLO WORLD (pas de changement)
emily-jane o'brien a Emily-jane O'brien (incorrect)
Maria von Trapp a Maria Von Trapp (incorrect)

70 votes

-1. Ce code css fonctionne, mais pas comme la plupart des gens l'espèrent, car si le texte commence en majuscules, il n'y a aucun effet. webmasterworld.com/forum83/7506.htm

2 votes

@Akshar : Une règle en minuscules serait remplacée par une règle en majuscules. Puisque les css ne modifient pas le contenu source, l'effet est que la règle des minuscules est supprimée (laissant le contenu source en majuscules) et ensuite la règle des majuscules est appliquée (sans rien faire).

76 votes

JS est utilisé en dehors des navigateurs.

236voto

Tuan Points 2977

Une manière légèrement plus élégante, en adaptant la fonction de Greg Dean :

String.prototype.toProperCase = function () {
    return this.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
};

Appelle ça comme ça :

"pascal".toProperCase();

5 votes

Gardez à l'esprit que si vous avez un utilisateur dont le nom comporte un tiret et qu'il saisit Jo-Ann Smith ce code les convertira en Jo-ann Smith (notez les minuscules a en Ann ).

20 votes

@daniellmb Pourquoi ne devrait-il pas modifier le prototype String ? Je pense que c'est une bonne solution. Pensez aux classes ouvertes de ruby, il est parfaitement valable d'ajouter des fonctions aux classes existantes et c'est largement accepté.

121 votes

@marco-fiset Parce qu'il ne joue pas bien avec les autres ! De mauvaises choses se produisent lorsque vous avez 2 bibliothèques qui essaient toutes les deux de modifier des objets JavaScript natifs avec des changements incompatibles. Imaginez que jQuery et Google Maps suivent ce modèle de conception, vous ne pourriez pas avoir les deux sur la même page.

190voto

Ariel M. Points 141

Voici ma version, IMO elle est facile à comprendre et élégante aussi.

const str = "foo bar baz";
const newStr = str.split(' ')
   .map(w => w[0].toUpperCase() + w.substring(1).toLowerCase())
   .join(' ');
console.log(newStr);

3 votes

Vous pouvez également mettre en minuscules la sous-chaîne dans le mappage : str.split(' ').map(i => i[0].toUpperCase() + i.substring(1).toLowerCase()).join(' ')

13 votes

Je ne suis pas d'accord pour appeler .toLowerCase() . Les noms tels que "McDonald" ou les acronymes tels que "ASAP" doivent conserver leurs caractères majuscules. Si quelqu'un a effectivement transmis une chaîne comme "heLLO", l'application ne doit pas supposer que les majuscules sont incorrectes.

1 votes

@ThomasHigginbotham Que pensez-vous de ça ? String.prototype.toTitleCase = function (blnForceLower) { var strReturn; (blnForceLower ? strReturn = this.toLowerCase() : strReturn = this); return strReturn .split(' ') .map(i => i[0].toUpperCase() + i.substr(1)) .join(' '); }

123voto

Geoffrey Booth Points 2040

Voici ma fonction qui convertit les titres en majuscules mais conserve les acronymes définis en majuscules et les mots mineurs en minuscules :

String.prototype.toTitleCase = function() {
  var i, j, str, lowers, uppers;
  str = this.replace(/([^\W_]+[^\s-]*) */g, function(txt) {
    return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
  });

  // Certain minor words should be left lowercase unless 
  // they are the first or last words in the string
  lowers = ['A', 'An', 'The', 'And', 'But', 'Or', 'For', 'Nor', 'As', 'At', 
  'By', 'For', 'From', 'In', 'Into', 'Near', 'Of', 'On', 'Onto', 'To', 'With'];
  for (i = 0, j = lowers.length; i < j; i++)
    str = str.replace(new RegExp('\\s' + lowers[i] + '\\s', 'g'), 
      function(txt) {
        return txt.toLowerCase();
      });

  // Certain words such as initialisms or acronyms should be left uppercase
  uppers = ['Id', 'Tv'];
  for (i = 0, j = uppers.length; i < j; i++)
    str = str.replace(new RegExp('\\b' + uppers[i] + '\\b', 'g'), 
      uppers[i].toUpperCase());

  return str;
}

Par exemple :

"TO LOGIN TO THIS SITE and watch tv, please enter a valid id:".toTitleCase();
// Returns: "To Login to This Site and Watch TV, Please Enter a Valid ID:"

1 votes

J'ai aimé le vôtre, je rencontre aussi des problèmes avec les chiffres romains... je viens de le patcher avec I, II, III, IV, etc.

0 votes

Les mots avec trait d'union doivent être mis en majuscules. Avec votre fonction JIM-BOB ne va pas à Jim-Bob il va plutôt vers Jim-bob

2 votes

Fixe. La regex dans la troisième ligne a été changée de /\w\S*/g a /([^\W_]+[^\s-]*) */g selon le commentaire de @awashburn ci-dessus pour régler ce problème.

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