2010-11-09 12 views
2

J'ai regardé autour de la façon d'utiliser JavaScript pour mettre les noms dans le bon cas, par exemple. george mchall deviendrait George McHall. J'ai pu trouver une place d'écriture sur CodeProject sur la façon de le faire, ainsi qu'une personne qui a l'intention pour le faire:Comment puis-je mettre des noms dans le cas de titre en JavaScript?

function toProperCase(s){ 
    return s.toLowerCase().replace(/\b((m)(a?c))?(\w)/g, 
    function($1, $2, $3, $4, $5) { 
    if($2){ 
    return $3.toUpperCase()+$4+$5.toUpperCase(); 
    } 
    return $1.toUpperCase(); 
}); 
} 

Cela permet ce que je cherche. Mais je dois pouvoir l'étendre davantage et ajouter des cas supplémentaires.

J'ai trouvé another page on John Gruber's site en faisant le cas du titre, mais je cherche seulement à faire des noms.

Alors, est-ce que quelqu'un a une idée sur l'extension? Je cherche vraiment un point dans la bonne direction.

Editer: Depuis que je semble frapper un mur ici, peut-être que quelqu'un a un moyen de le faire côté serveur. C'est au moins pour l'instant en utilisant ColdFusion pour le côté serveur. J'ai vu une implémentation en C#, mais je ne suis pas capable de passer en C# pour le moment.

+5

Le problème est plus compliqué qu'il n'y paraît au premier abord. Vous devrez autoriser les cas au-delà de Mac/Mc. Par exemple, O'Brien, D'Agostino, LaSalle, etc. Regex peut ne pas s'avérer être le meilleur outil pour cela. Vous devrez peut-être recourir à une sorte de dictionnaire. – Robusto

+0

Il prend déjà en compte les noms avec 'et - parce que l'expression régulière les compte comme un nouveau mot après le trait d'union ou l'apostrophe. Et la regex est déjà responsable du Mc/Mac. Je cherche vraiment à rendre compte des cas de La *. Quoi qu'il en soit, je suis manquant, je * devrais savoir comment ajouter une fois que je trouve comment continuer à l'étendre. Il n'y a rien de critique, j'essaie juste d'en attraper autant que possible pour obtenir une sortie cohérente. –

+0

Considérez également les différents noms latins, comme "Oscar de la Renta" où il est incorrect pour les "de" et "la" à capitaliser. –

Répondre

3

Que diriez-vous ceci:

if (str==str.toLowerCase() || str==str.toUpperCase()) 
    str = str.toTitleCase(); 

Sinon, laissez bien seul !!! Edit: Vous pouvez éventuellement diviser la chaîne pour éliminer les personnes qui détiennent la touche Maj trop longtemps, comme SMith.

+0

Après discussion dans les commentaires de la question c'est la "meilleure" solution. Cependant, 'toTitleCase()' ne fonctionne pas du tout pour moi. Peut-être que l'élaboration de votre réponse aiderait. –

+0

Désolé, j'ai pensé que c'était une fonction intégrée. Voici une implémentation qui va le faire fonctionner: http://individed.com/code/to-title-case/js/to-title-case.js –

+0

Prenant ceci comme ma réponse parce que c'est "assez bon" et devrait essayer au moins pour attraper les majuscules verrouiller les délinquants qui semble être le plus grand groupe fautif. –

0

En combinant quelques réponses de messages similaires:

function properName(name) { 
    return ("" + name.replace(/[^\s\-\']+[\s\-\']*/g, function (word) { 
    return word.charAt(0).toUpperCase() + word.substr(1).toLowerCase(); 
    }).replace(/\b(Van|De|Der|Da|Von)\b/g, function (nobiliaryParticle) { 
    return nobiliaryParticle.toLowerCase(); 
    }).replace(/Mc(.)/g, function (match, letter3) { 
    return 'Mc' + letter3.toUpperCase(); 
    })); 
} 

Cette capitalise arbitrairement la lettre après « Mc » mais pas après « Mac » et ne traite pas des noms comme LaSalle ou Terhorst (parce que je n » pas besoin d'eux).

Voici un JSFiddle (en utilisant les candidats pour Grayndler lors des élections fédérales australiennes de 2016).