Existe-t-il un moyen simple de convertir une chaîne en casse de 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 doublure à une ou deux lignes.
javascript
title-case
MDCore
la source
la source
Réponses:
Essaye ça:
la source
\w\S*
est utilisé à la place\w+
ou\w*
par exemple? Je ne sais pas pourquoi vous voudriez inclure autre chose que des espaces et donc changer Jim-Bob en Jim-bob .\w\S*
également causé leJim-bob
problème de notre côté. Utilisation\w*
résolu ce problème./([^\W_]+[^\s-]*) */g
résout leJim-Bob
problème, à savoir:jim-bob
-->
Jim-Bob
jim-bob
-->
Jim-Bob
est votre désir, vous devriez probablement le faire/\b\w+/g
. Exemple:str.replace(/\b\w+/g,function(s){return s.charAt(0).toUpperCase() + s.substr(1).toLowerCase();});
\w\S*
est utilisé à la place de\w+
ou\w*
pour que les mots commeDon't
ne soient pas modifiésDon'T
, mais comme d'autres l'ont souligné, cela\w\S*
cause des problèmes avec les mots avec trait d'union.Une manière un peu plus élégante, adaptant la fonction de Greg Dean:
Appelez ça comme:
la source
Jo-Ann Smith
, ce code le convertira enJo-ann Smith
(notez les minusculesa
dansAnn
).Essayez d'appliquer le style CSS de transformation de texte à vos contrôles.
par exemple:
(text-transform: capitalize);
N'utilisez une approche JS qu'en cas de nécessité absolue.
la source
Voici ma version, IMO c'est facile à comprendre et élégant aussi.
la source
str.split(' ').map(i => i[0].toUpperCase() + i.substring(1).toLowerCase()).join(' ')
.toLowerCase()
. Des noms tels que "McDonald" ou des acronymes comme "ASAP" doivent conserver leurs caractères majuscules. Si quelqu'un a réellement passé une chaîne comme "heLLO", l'application ne doit pas supposer que les lettres majuscules sont incorrectes.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(' '); }
str
s'agit d'un seul caractère.Voici ma fonction qui se convertit en casse de titre mais conserve également les acronymes définis en majuscules et les mots mineurs en minuscules:
Par exemple:
la source
/\w\S*/g
la/([^\W_]+[^\s-]*) */g
par le commentaire de @ awashburn ci - dessus pour résoudre ce problème./\b\w+/g
, que je trouve plus compréhensible plus rapidement?/([^\W_]+[^\s-]*) */g
à/\b\w+/g
par @ commentaire de Michael; veuillez commenter si vous trouvez un cas où l'expression régulière plus compliquée est nécessaire./\b[\w-\']+/g
pour autoriser les mots avec trait d'union et l'apostrophe dans les mots.Je préfère ce qui suit aux autres réponses. Il ne correspond qu'à la première lettre de chaque mot et le met en majuscule. Code plus simple, plus facile à lire et moins d'octets. Il préserve les majuscules existantes pour éviter de fausser les acronymes. Cependant, vous pouvez toujours appeler
toLowerCase()
votre chaîne en premier.Vous pouvez l'ajouter à votre prototype de chaîne qui vous permettra de
'my string'.toTitle()
:Exemple:
Afficher l'extrait de code
la source
const titleCase = (str) => str.replace(/\b\S/g, t => t.toUpperCase());
NoT qUiITe
.toLowerCase
. Sachez simplement que cela briserait les acronymes.an HTML document
:An HTML Document
vsAn Html Document
toLowerCase
quelle (avec la modification suggérant ) est plus flexible / utile que celle qui suppose les intentions des développeurs. Cette méthode reflète également la fonctionnalité de méthodes intégrées similaires d'autres langages tels que PHP (ucwords
) et Golang (strings.Title
). .NET (TextInfo.ToTitleCase
) fonctionne de manière intéressante pour les cas mixtes, mais laisserait également inchangées les chaînes entièrement capitalisées.Sans utiliser l'expression régulière juste pour référence:
la source
la source
'string'.replace(/^(.)(.*)/,function(s,p1,p2){return p1.toUpperCase()+p2;})
encore une fois, cela ne fonctionne que pour mettre en majuscule la première lettre d'une chaîne, mais au cas où vous en auriez besoin, ma construction fonctionne.'$1'.toUpperCase()
, il semble que la majuscule n'ait pas été faite au moment où la valeur est affectée. Contourné en utilisant la fonction'string'.replace(/^(.){1}/,function(match) { return match.toUpperCase(); })
Vous pouvez immédiatement
toLowerCase
la chaîne, puis justetoUpperCase
la première lettre de chaque mot. Devient une doublure très simple:la source
s => s.toUpperCase()
). Ma variante est de faire ce que vous avez fait, mais en étendant l'objet String (aussi controversé que cela soit):Object.defineProperty(String.prototype, '_toProperCase', {value:function() {return this.toLowerCase().replace(/\b(\w)/g, function(t) {return t.toUpperCase()})}})
=>
, c'est-à-dire une fonction de flèche native (ES6), le lien saute vers les documents Mozillla sur eux qui fournit également une table de support.Juste au cas où vous seriez inquiet à propos de ces mots de remplissage, vous pouvez toujours simplement dire à la fonction ce qu'il ne faut pas mettre en majuscule.
J'espère que cela vous aidera.
Éditer
Si vous souhaitez gérer les principaux mots de la colle, vous pouvez garder une trace de cette w / une variable de plus:
la source
glue ='de|da|del|dos|do|das|des|la|della|delli'.split('|');
and another thing
devientand Another Thing
. Juste besoin d'une manière élégante de toujours mettre en majuscule le premier mot.Si l'expression régulière utilisée dans les solutions ci-dessus vous rend confus, essayez ce code:
la source
split
ne le convertir en un tableau, vous ne voyez pas seulement comme évidemment parce quemap
signifie que vous ne devez pas utiliser la[]
notationJ'ai fait cette fonction qui peut gérer les noms de famille (donc ce n'est pas la casse du titre) comme "McDonald" ou "MacDonald" ou "O'Toole" ou "D'Orazio". Il ne gère cependant pas les noms allemands ou néerlandais avec "van" ou "von" qui sont souvent en minuscules ... Je pense que "de" est souvent aussi en minuscules comme "Robert de Niro". Il faudrait encore y remédier.
la source
macy
problème en y mettant un lookahead négatif, alors cela\b((m)(a?c))?(\w)
devient\b((m)(a?c))?(\w)(?!\s)
Semble fonctionner ... Testé avec ce qui précède, "le brun rapide, le renard? / Saute / ^ sur ^ le chien paresseux! ..." et "C: / fichiers de programme / certains fournisseurs / leur 2ème application / a file1.txt ".
Si vous voulez 2Nd au lieu de 2nd, vous pouvez passer à
/([a-z])(\w*)/g
.Le premier formulaire peut être simplifié comme suit:
la source
Essaye ça
Exemple
la source
Si vous pouvez utiliser des bibliothèques tierces dans votre code, lodash a une fonction d'assistance pour nous.
https://lodash.com/docs/4.17.3#startCase
la source
Essayez ceci, le plus court:
la source
ES 6
autre
la source
s.slice(0, 1).toUpperCase()
si vous voulez toujours cette première lettre.str
est un seul personnage.charAt(0).toUpperCase()
.La plupart de ces réponses semblent ignorer la possibilité d'utiliser le métacaractère de limite de mot (\ b). Une version plus courte de la réponse de Greg Dean l'utilisant:
Fonctionne également pour les noms avec trait d'union comme Jim-Bob.
la source
\w
ne comprend que les caractères[A-Za-z0-9_]
, pas toutes les lettres. Pour cela, vous devez utiliser la catégorie Unicode\p{L}
. Vous aurez besoin du/u
modificateur (voir ici ) et d'une solution différente pour\b
, qui ne fonctionne qu'entre\W
et\w
(voir ici )Je pense que le plus simple est d'utiliser CSS.
la source
Utilisez
/\S+/g
pour soutenir les signes diacritiques:Cependant: " s Unshine ( y ellow)" ⇒ " S Unshine ( y ellow)"
la source
Je voulais ajouter ma propre réponse car j'avais besoin d'une
toTitleCase
fonction robuste qui prend en compte les règles de grammaire énumérées ici (article recommandé par Google). Il existe différentes règles qui dépendent de la longueur de la chaîne d'entrée. Voici la fonction + tests unitaires.La fonction consolide également les espaces et supprime les caractères spéciaux (modifiez l'expression régulière selon vos besoins)
Fonction toTitleCase
Tests unitaires pour garantir l'exactitude
Veuillez noter que je retire pas mal de caractères spéciaux des chaînes fournies. Vous devrez modifier le regex pour répondre aux exigences de votre projet.
la source
la source
o'henry
, mais fait des trucs bizarres avechorse's mouth
."john f. kennEdy".toLowerCase().replace(/\b\S/g, t => t.toUpperCase())
mieux w\b
et\S
sont des classes de caractères spéciaux désignant les «limites de mots» et les «caractères simples non blancs. Ainsi, l'expression régulière correspond à chaque caractère suivant une limite de mot et met en majuscule ce caractère en appliquant la fonction de flèche donnée.En prenant la solution "lewax00", j'ai créé cette solution simple qui force à "w" en commençant par l'espace ou "w" qui initie le mot, mais n'est pas en mesure de supprimer les espaces intermédiaires supplémentaires.
Le résultat est "Sofía Vergara".
la source
Voici ma fonction qui s'occupe des caractères accentués (important pour le français!) Et qui peut activer / désactiver la gestion des exceptions basses. J'espère que cela pourra aider.
la source
Nous avons eu une discussion ici au bureau et nous pensons qu'essayer de corriger automatiquement la façon dont les gens saisissent les noms de la manière actuelle que vous voulez qu'il fasse est semé d'embûches.
Nous avons trouvé plusieurs cas où différents types de capitalisation automatique se désagrègent et ce sont uniquement pour les noms anglais, chaque langue a ses propres complexités.
Problèmes de mise en majuscule de la première lettre de chaque nom:
• Les acronymes tels qu'IBM ne peuvent pas être saisis, se transformeraient en Ibm.
• Le nom McDonald se transformerait en Mcdonald, ce qui est incorrect, la même chose est MacDonald aussi.
• Les noms à double canon tels que Marie-Tonks deviendraient Marie-tonks.
• Des noms comme O'Connor se transformeraient en O'connor.
Pour la plupart d'entre eux, vous pouvez écrire des règles personnalisées pour y faire face, cependant, cela a toujours des problèmes avec Acronymes comme avant et vous obtenez un nouveau problème:
• L'ajout d'une règle pour fixer les noms avec Mac comme MacDonald, ferait que les noms de rupture comme Macy le transforment en MacY.
La seule solution que nous avons trouvée qui n'est jamais incorrecte est de mettre en majuscule chaque lettre qui est une méthode de force brute que le DBS semble également utiliser.
Donc, si vous voulez automatiser le processus, il est presque impossible de se passer d'un dictionnaire de chaque nom et mot et de la façon dont il devrait être capitalisé.Si vous n'avez pas de règle qui couvre tout, ne l'utilisez pas comme il ne fera qu'ennuyer vos utilisateurs et inciter les personnes qui souhaitent saisir correctement leur nom à aller ailleurs.
la source
voici une autre solution utilisant css (et javascript, si le texte que vous souhaitez transformer est en majuscule):
html
js
css
la source
Pour ceux d'entre nous qui ont peur des expressions régulières (lol):
la source
Ma solution monoligne:
Ensuite, vous pouvez appeler la méthode
capitalizeWords()
sur n'importe quelle chaîne. Par exemple:Mon autre solution:
Ensuite, vous pouvez appeler la méthode
capitalizeWords()
sur n'importe quelle chaîne. Par exemple:Solution alternative basée sur la réponse de Greg Dean:
Ensuite, vous pouvez appeler la méthode
capitalizeWords()
sur n'importe quelle chaîne. Par exemple:la source
Surpris de voir que personne n'a mentionné l'utilisation du paramètre de repos. Voici un simple liner qui utilise les paramètres ES6 Rest.
la source
Ceci est basé sur ma solution pour Bonfire "Title Case" de FreeCodeCamp , qui vous oblige à convertir d'abord la chaîne donnée en minuscules et ensuite convertir chaque caractère procédant d'un espace en majuscules.
Sans utiliser l'expression régulière:
la source