Преобразовать строку в заголовок с помощью JavaScript - PullRequest
477 голосов
/ 13 октября 2008

Есть ли простой способ преобразования строки в регистр заголовков? Например. john smith становится John Smith. Я не ищу ничего сложного, такого как решение Джона Резига , просто (надеюсь) какой-то одно- или двухслойный.

Ответы [ 49 ]

10 голосов
/ 18 октября 2016

Вы можете сразу toLowerCase строка, а затем просто toUpperCase первая буква каждого слова. Становится очень простым 1 вкладышем:

function titleCase(str) {
  return str.toLowerCase().replace(/\b(\w)/g, s => s.toUpperCase());
}

console.log(titleCase('iron man'));
console.log(titleCase('iNcrEdible hulK'));
8 голосов
/ 04 февраля 2010

Я сделал эту функцию, которая может обрабатывать фамилии (поэтому это не регистр названий), такие как «Макдональд», «Макдональд», «О'Тул» или «Д'Орацио». Однако он не обрабатывает немецкие или голландские имена с "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(); });
}
7 голосов
/ 13 октября 2008
var toMatch = "john w. smith";
var result = toMatch.replace(/(\w)(\w*)/g, function (_, i, r) {
      return i.toUpperCase() + (r != null ? r : "");
    }
)

Кажется, работает ... Протестировано с вышеизложенным: «быстро-коричневый, лиса? / Прыжки / ^ над ^ ленивым! Собака ...» и «C: / программные файлы / какой-то поставщик / их второе приложение / файл1.txt».

Если вы хотите 2Nd вместо 2-го, вы можете изменить на /([a-z])(\w*)/g.

Первая форма может быть упрощена как:

function toTitleCase(toTransform) {
  return toTransform.replace(/\b([a-z])/g, function (_, initial) {
      return initial.toUpperCase();
  });
}
7 голосов
/ 27 октября 2016

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(' ')
7 голосов
/ 06 июня 2017

Попробуйте это, кратчайший путь:

str.replace(/(^[a-z])|(\s+[a-z])/g, txt => txt.toUpperCase());
7 голосов
/ 16 мая 2012

Попробуйте это

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

Пример

var str = 'john smith';
str.toProperCase();
6 голосов
/ 07 июля 2017

Я думаю, что самым простым является использование CSS.

function format_str(str) {
    str = str.toLowerCase();
    return '<span style="text-transform: capitalize">'+ str +'</span>';
}
6 голосов
/ 16 июля 2014

Большинство из этих ответов, похоже, игнорируют возможность использования метасимвола границы слова (\ b). Более короткая версия ответа Грега Дина с его использованием:

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

Работает для переносимых имен, таких как Джим-Боб.

5 голосов
/ 20 июня 2016

Используйте /\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

Однако: " s unshine ( y ellow)" ⇒ " S unshine ( y ellow)"

5 голосов
/ 29 декабря 2016

Если вы можете использовать сторонние библиотеки в своем коде, тогда у 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'
...