使用JavaScript将string转换为标题大小写

有一个简单的方法来将string转换为标题大小写吗? john smith成为John Smith 。 我不是在寻找一些像John Resig的解决scheme那样复杂的东西,只是(希望是)某种单行或双行的。

尝试这个:

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

使用Greg Dean的function稍微优雅一些​​:

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

像这样称呼它:

 "pascal".toProperCase(); 

尝试将文本转换 CSS样式应用于您的控件。

例如: (text-transform: capitalize);

只有在绝对必要时才使用JS方法。

这是我的函数,转换为标题大小写,但也保留定义的缩写为大小写字母小写:

 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; } 

例如:

 "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:" 

这是我的版本,国际海事组织也很容易理解和优雅。

 var str = "foo bar baz" str.split(' ') .map(w => w[0].toUpperCase() + w.substr(1).toLowerCase()) .join(' ') // returns "Foo Bar Baz" 

如果在上面的解决scheme中使用正则expression式让你感到困惑,请尝试下面的代码:

 function titleCase(str) { return str.split(' ').map(function(val){ return val.charAt(0).toUpperCase() + val.substr(1).toLowerCase(); }).join(' '); } 

这只适用于一个string,但这就是我所需要的:

 'string'.replace(/^[az]/, function (x) {return x.toUpperCase()}) // String 

JSFiddle: https ://jsfiddle.net/simo/gou2uhLm/

以防万一你担心这些填充词,你总是可以告诉函数什么不能大写。

 /** * @param String str The text to be converted to titleCase. * @param Array glue the words to leave in lowercase. */ var titleCase = function(str, glue){ glue = (glue) ? glue : ['of', 'for', 'and']; return str.replace(/(\w)(\w*)/g, function(_, i, r){ var j = i.toUpperCase() + (r != null ? r : ""); return (glue.indexOf(j.toLowerCase())<0)?j:j.toLowerCase(); }); }; 

希望这可以帮助你。

不使用正则expression式仅供参考:

 String.prototype.toProperCase = function() { var words = this.split(' '); var results = []; for (var i=0; i < words.length; i++) { var letter = words[i].charAt(0).toUpperCase(); results.push(letter + words[i].slice(1)); } return results.join(' '); }; 'john smith'.toProperCase(); 

我做了这个可以处理姓氏(如“麦克唐纳”或“麦克唐纳”或“奥图尔”或“奥拉齐奥”)的函数。 但是它不会处理德国或荷兰的名字,通常是小写的“van”或“von”……我相信“de”通常也是小写的,比如“Robert de Niro”。 这些仍然需要解决。

 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(); }); } 

尝试这个

 String.prototype.toProperCase = function(){ return this.toLowerCase().replace(/(^[az]| [az]|-[az])/g, function($1){ return $1.toUpperCase(); } ); }; 

 var str = 'john smith'; str.toProperCase(); 
 var toMatch = "john w. smith"; var result = toMatch.replace(/(\w)(\w*)/g, function (_, i, r) { return i.toUpperCase() + (r != null ? r : ""); } ) 

似乎工作…经过上面的testing,“快速的棕色,狐狸/跳跃/ ^超过”懒狗!“和”C:/程序文件/一些供应商/他们的第二个应用程序/一FILE1.TXT”。

如果你想要2Nd而不是2nd,你可以改成/([az])(\w*)/g

第一种forms可以简化为:

 function toTitleCase(toTransform) { return toTransform.replace(/\b([az])/g, function (_, initial) { return initial.toUpperCase(); }); } 

你可以立即给下toLowerCasestring下一个字母,然后toUpperCase上一个字母的第一个字母。 成为一个非常简单的1class轮:

 function titleCase(str) { return str.toLowerCase().replace(/\b(\w)/g, s => s.toUpperCase()); } console.log(titleCase('iron man')); console.log(titleCase('iNcrEdible hulK')); 

这些答案大部分似乎忽略了使用单词边界元字符(\ b)的可能性。 格雷格·迪恩(Greg Dean)的答案是:

 function toTitleCase(str) { return str.replace(/\b\w/g, function (txt) { return txt.toUpperCase(); }); } 

适用于像吉姆 – 鲍勃这样的连字符名字。

这是我的function,正在照顾重音字符(重要的是法语!),并可以打开/closures处理降低exception。 希望有所帮助。

 String.prototype.titlecase = function(lang, withLowers = false) { var i, string, lowers, uppers; string = this.replace(/([^\s:\-'])([^\s:\-']*)/g, function(txt) { return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); }).replace(/Mc(.)/g, function(match, next) { return 'Mc' + next.toUpperCase(); }); if (withLowers) { if (lang == 'EN') { lowers = ['A', 'An', 'The', 'At', 'By', 'For', 'In', 'Of', 'On', 'To', 'Up', 'And', 'As', 'But', 'Or', 'Nor', 'Not']; } else { lowers = ['Un', 'Une', 'Le', 'La', 'Les', 'Du', 'De', 'Des', 'À', 'Au', 'Aux', 'Par', 'Pour', 'Dans', 'Sur', 'Et', 'Comme', 'Mais', 'Ou', 'Où', 'Ne', 'Ni', 'Pas']; } for (i = 0; i < lowers.length; i++) { string = string.replace(new RegExp('\\s' + lowers[i] + '\\s', 'g'), function(txt) { return txt.toLowerCase(); }); } } uppers = ['Id', 'R&d']; for (i = 0; i < uppers.length; i++) { string = string.replace(new RegExp('\\b' + uppers[i] + '\\b', 'g'), uppers[i].toUpperCase()); } return string; } 

以“lewax00”解决scheme,我创build了这个简单的解决scheme,强制“W”开始空格或“W”开始词,但不能删除额外的中间空间。

 "SOFÍA vergara".toLowerCase().replace(/\b(\s\w|^\w)/g, function (txt) { return txt.toUpperCase(); }); 

使用/\S+/g来支持变音符号:

 function toTitleCase(str) { return str.replace(/\S+/g, str => str.charAt(0).toUpperCase() + str.substr(1).toLowerCase()); } console.log(toTitleCase("a city named örebro")); // A City Named Örebro 

如果你可以在你的代码中使用第三方库,那么lodash会为我们提供一个辅助函数。

https://lodash.com/docs/4.17.3#startCase

 _.startCase('foo bar'); // => 'Foo Bar' _.startCase('--foo-bar--'); // => 'Foo Bar' _.startCase('fooBar'); // => 'Foo Bar' _.startCase('__FOO_BAR__'); // => 'FOO BAR' 

作为John Resig的解决scheme的全部function,但作为一个单线:(根据这个github项目 )

 function toTitleCase(e){var t=/^(a|an|and|as|at|but|by|en|for|if|in|of|on|or|the|to|vs?\.?|via)$/i;return e.replace(/([^\W_]+[^\s-]*) */g,function(e,n,r,i){return r>0&&r+n.length!==i.length&&n.search(t)>-1&&i.charAt(r-2)!==":"&&i.charAt(r-1).search(/[^\s-]/)<0?e.toLowerCase():n.substr(1).search(/[AZ]|\../)>-1?e:e.charAt(0).toUpperCase()+e.substr(1)})}; console.log( toTitleCase( "ignores mixed case words like iTunes, and allows AT&A and website.com/address etc..." ) ); 

简单的更高性能的版本,简单的caching。

  var TITLE_CASE_LOWER_MAP = { 'a': 1, 'an': 1, 'and': 1, 'as': 1, 'at': 1, 'but': 1, 'by': 1, 'en':1, 'with': 1, 'for': 1, 'if': 1, 'in': 1, 'of': 1, 'on': 1, 'the': 1, 'to': 1, 'via': 1 }; // LEAK/CACHE TODO: evaluate using LRU. var TITLE_CASE_CACHE = new Object(); toTitleCase: function (title) { if (!title) return null; var result = TITLE_CASE_CACHE[title]; if (result) { return result; } result = ""; var split = title.toLowerCase().split(" "); for (var i=0; i < split.length; i++) { if (i > 0) { result += " "; } var word = split[i]; if (i == 0 || TITLE_CASE_LOWER_MAP[word] != 1) { word = word.substr(0,1).toUpperCase() + word.substr(1); } result += word; } TITLE_CASE_CACHE[title] = result; return result; }, 

ES 6

 str.split(' ').map((s) => (s.slice(0, 1).toUpperCase() + s.slice(1).toLowerCase())).join(' ') 

其他

 str.split(' ').map(function (s) { return s.slice(0, 1).toUpperCase() + s.slice(1).toLowerCase(); }).join(' ') 

对于那些害怕正则expression式的人(哈哈):

 function titleCase(str) { var words = str.split(" "); for ( var i = 0; i < words.length; i++ ) { var j = words[i].charAt(0).toUpperCase(); words[i] = j + words[i].substr(1); } return words.join(" "); } 

我认为最简单的是使用CSS。

 function format_str(str) { return '<span style="text-transform: capitalize">'+ str +'</span>'; } 

试试这个,最短的方法:

 str.replace(/(^[az])|(\s+[az])/g, txt => txt.toUpperCase()); 

这不是简短的,但这是我最近在学校的任务:

 var myPoem = 'What is a jQuery but a misunderstood object?' //What is a jQuery but a misunderstood object? --> What Is A JQuery But A Misunderstood Object? //code here var capitalize = function(str) { var strArr = str.split(' '); var newArr = []; for (var i = 0; i < strArr.length; i++) { newArr.push(strArr[i].charAt(0).toUpperCase() + strArr[i].slice(1)) }; return newArr.join(' ') } var fixedPoem = capitalize(myPoem); alert(fixedPoem); 

Greg Dean解决scheme的原型解决scheme:

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

这是基于我的解决scheme为FreeCodeCamp的篝火“标题案例” ,这需要您先将给定的string转换为全部小写,然后将每个字符进行一个空格大写。

不使用正则expression式:

 function titleCase(str) { return str.toLowerCase().split(' ').map(function(val) { return val.replace(val[0], val[0].toUpperCase()); }).join(' '); } 

我的问题简单易用:

  function titlecase(str){ var arr=[]; var str1=str.split(' '); for (var i = 0; i < str1.length; i++) { var upper= str1[i].charAt(0).toUpperCase()+ str1[i].substr(1); arr.push(upper); }; return arr.join(' '); } titlecase('my name is suryatapa roy'); 

强大的function性编程方式来完成Title Case Function

Exaplin版本

 function toTitleCase(input){ let output = input .split(' ') // 'HOw aRe YOU' => ['HOw' 'aRe' 'YOU'] .map((letter) => { let firstLetter = letter[0].toUpperCase() // H , a , Y => H , A , Y let restLetters = letter.substring(1).toLowerCase() // Ow, Re, OU => ow, re, ou return firstLetter + restLetters // conbine together }) .join(' ') //['How' 'Are' 'You'] => 'How Are You' return output } 

实施版本

 function toTitleCase(input){ return input .split(' ') .map(i => i[0].toUpperCase() + i.substring(1).toLowerCase()) .join(' ') } toTitleCase('HoW ARe yoU') // reuturn 'How Are You' 

我们一直在这里讨论这个办公室,我们认为试图以目前的方式自动纠正人们input姓名的方式是充满了可能的问题。

我们提出了几种不同types的汽车资本化解体的例子, 这些只是英文名字,每种语言都有自己的复杂性。

大写每个名字的第一个字母的问题:

•IBM等缩写不允许input,会变成Ibm。

•麦当劳名字会变成麦当劳,这是不正确的,麦当劳也一样。

•像玛丽 – 唐克斯这样的双人名字会变成玛丽 – 托克斯。

•奥康纳这样的名字会变成奥康纳。

对于其中的大多数,你可以编写自定义的规则来处理它,但是,这仍然与缩写问题一样,你会得到一个新的问题:

•添加一个规则来修复名称与Mac,如MacDonald,会打破名称,如梅西把它变成MacY。

我们提出的唯一解决scheme永远不会是错误的,那就是将每一个字母都用作DBS似乎也使用的暴力方法。

所以,如果你想自动化这个过程,就不可能做到没有每一个单词和单词的字典,也不应该如何应用它。 如果你没有一个涵盖所有东西的规则,就不要使用它只会惹恼你的用户,并提示那些想正确input其姓名的人去其他地方。