Существует ли простой способ преобразования строки в регистр заголовков? Например. john smith становится John Smith пустые строки («»), null, undefined, false и число 0 и NaN. Решение Джона Ресига . это код:

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

    function toTitleCase(str) {
        return str.replace(
            /wS*/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>

немного более элегантным способом, адаптируя функцию Грега Дина:

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

Назовите это следующим образом:

"pascal".toProperCase();

Попробуйте применить text-transform http://www.onlineaspect.com/2010/01/15/backwards-compatible-postmessage/ Пример Barebones …

не повторяющихся дважды! (text-transform: capitalize);

Используйте подход JS только тогда, когда это абсолютно необходимо.

селектор:

var str = "foo bar baz"

str.split(' ')
   .map(w => w[0].toUpperCase()   w.substr(1).toLowerCase())
   .join(' ')

// returns "Foo Bar Baz"

Вот моя функция, которая преобразует в регистр заглавия, но также сохраняет определенные аббревиатуры в верхнем и нижнем регистре в нижнем регистре:

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

. Я предпочитаю следующее из других ответов. Он соответствует только первой букве каждого слова и заглавными буквами. Более простой код, легче для чтения и меньше байтов. Он сохраняет существующие заглавные буквы для предотвращения искажений аббревиатур. Однако вы всегда можете вызвать toLowerCase() Я не знаю, что вам нужно добавить 30 к длине … 1 работал для меня.

function title(str) {
  return str.replace(/(^|s)S/g, function(t) { return t.toUpperCase() });
}

, включая: 'my string'.toTitle() Обратите внимание, что по умолчанию директивы не создают новую область видимости, то есть по умолчанию используется

String.prototype.toTitle = function() {
  return this.replace(/(^|s)S/g, function(t) { return t.toUpperCase() });
}

Я считаю, что что-то простое, как это, было бы гораздо более кратким и читаемым лично.

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

К вашему сведению

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

edit

может быть немного поздно, так как все остальные ответы старше :-) но … вот мое решение. Проверено в реальных FF, Chrome и Safari 5.0.

, самую популярную библиотеку для стандартных и безопасных криптографических алгоритмов, реализованных в JavaScript с использованием лучших практик и шаблонов.

var titleCase = function(str, glue){
    glue = !!glue ? glue : ['of', 'for', 'and', 'a'];
    var first = true;
    return str.replace(/(w)(w*)/g, function(_, i, r) {
        var j = i.toUpperCase()   (r != null ? r : '').toLowerCase();
        var result = ((glue.indexOf(j.toLowerCase()) < 0) || first) ? j : j.toLowerCase();
        first = false;
        return result;
    });
};

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

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

наблюдаемый, шаблон публикации / подписки

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

JSFiddle: Сайт A =

Вы можете немедленно toLowerCase в виде строки, а затем просто toUpperCase http://bar.com

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

console.log(titleCase('iron man'));
console.log(titleCase('iNcrEdible hulK'));

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

SiteB загружается внутри сайта siteA

. Первая форма может быть упрощена как: /([a-z])(w*)/g Глядя на вывод

Если вы хотите добавить безопасное соединение, вы можете использовать это условие if в

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

Цикл Telize

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

Внутри IFrame:

str.replace(/(^[a-z])|(s [a-z])/g, txt => txt.toUpperCase());

else

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

Для этого требуется, чтобы логика на стороне сервера была способна вычислять размеры визуализированного содержимого iframe. ,

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

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

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

Работает и для дефисных имен, таких как Jim-Bob ,

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

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

Использование /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

http://jsfiddle.net/00qggsjj/2/ вы можете добавить его в существующий проект без необходимости переписывать файлы JavaScript. unshine ( Я внедряю решение ConroyP для покадрового замещения решения, основанного на настройке document.domain, но обнаружил, что довольно сложно правильно определить высоту содержимого iframe в разных браузерах (тестирование с FF11, Ch17 и IE9 прямо сейчас). ellow) «⇒» S unshine ( Я внедряю решение ConroyP для покадрового замещения решения, основанного на настройке document.domain, но обнаружил, что довольно сложно правильно определить высоту содержимого iframe в разных браузерах (тестирование с FF11, Ch17 и IE9 прямо сейчас). ellow) «

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

Принимая решение» lewax00 «, я создал это простое решение, которое заставляет» w «начинаться с пробел или «w», которые инициируют слово, но не могут удалить лишние промежуточные пробелы.

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

Результат — «Sofía Vergara».

Вот моя функция, которая заботится о символах с акцентом (важно для французского!) и которая может включать / выключать обработку более низких исключений. Надеюсь, это поможет.

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

Для тех из нас, кто боится регулярных выражений (смеется):

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

Мы провели дискуссию здесь, в офисе, и мы думаем, что попытка автоматического исправления того, как люди вводят имена в том виде, в котором вы хотите, чтобы это происходило, чревата возможными проблемами.

Мы придумали несколько случаев, когда разные типы автокапитализации расходятся , и это только для английских имен, у каждого языка есть свои сложности.

Проблемы с использованием заглавных букв первой буквы каждого имени:

Мне нужно иметь возможность отображать некоторые теги HTML внутри текстовой области (а именно & Amp ; lt ; strong & Amp ; gt {*** }, & amp ; lt ; i & amp ; gt ;, & amp ; lt ; u & amp ; gt ;, & amp ; lt ; a & amp ; gt ;) но текстовые области только интерпретируют свое содержание как текст. Есть ли простой способ doi …

этот вопрос

• Двуствольные имена, такие как Marie-Tonks, превратятся в Marie-tonks.

• Такие имена, как О’Коннор, превратятся в О’Коннор.

В зависимости от того, что работает лучше всего, вопрос как личного вкуса, так и конкретного варианта использования, который вы реализуете.

• Добавление в правило для исправления имен с Mac, таких как MacDonald, приведет к тому, что имена разрывов, такие как Macy, превратят его в MacY.

В вашем случае вы присваиваете свойство

. Так что если вы хотите автоматизировать процесс, то без словаря обойтись практически невозможно. каждого имени и слова и как оно должно быть прописным, Если у вас нет правила, которое охватывает все, не используйте его, так как оно будет раздражать ваших пользователей и подсказывать людям, которые хотят правильно ввести их имена, чтобы пойти куда-нибудь еще.

Я хотел добавить свой собственный ответ, так как мне нужна надежная toTitleCase функция, которая учитывает правила грамматики , указанного здесь (Google рекомендует статью). Существуют различные правила, которые зависят от длины входной строки. Ниже приведена функция модульных тестов.

для события, чтобы предотвратить распространение объекта

toTitleCase Function

const toTitleCase = (str) => {
  const articles = ['a', 'an', 'the'];
  const conjunctions = ['for', 'and', 'nor', 'but', 'or', 'yet', 'so'];
  const prepositions = [
    'with', 'at', 'from', 'into','upon', 'of', 'to', 'in', 'for',
    'on', 'by', 'like', 'over', 'plus', 'but', 'up', 'down', 'off', 'near'
  ];

  // The list of spacial characters can be tweaked here
  const replaceCharsWithSpace = (str) => str.replace(/[^0-9a-z&/\]/gi, ' ').replace(/(ss )/gi, ' ');
  const capitalizeFirstLetter = (str) => str.charAt(0).toUpperCase()   str.substr(1);
  const normalizeStr = (str) => str.toLowerCase().trim();
  const shouldCapitalize = (word, fullWordList, posWithinStr) => {
    if ((posWithinStr == 0) || (posWithinStr == fullWordList.length - 1)) {
      return true;
    }

    return !(articles.includes(word) || conjunctions.includes(word) || prepositions.includes(word));
  }

  str = replaceCharsWithSpace(str);
  str = normalizeStr(str);

  let words = str.split(' ');
  if (words.length <= 2) { // Strings less than 3 words long should always have first words capitalized
    words = words.map(w => capitalizeFirstLetter(w));
  }
  else {
    for (let i = 0; i < words.length; i  ) {
      words[i] = (shouldCapitalize(words[i], words, i) ? capitalizeFirstLetter(words[i], words, i) : words[i]);
    }
  }

  return words.join(' ');
}

Но, как показано ниже, это следует использовать, если вы уверены, что

import { expect } from 'chai';
import { toTitleCase } from '../../src/lib/stringHelper';

describe('toTitleCase', () => {
  it('Capitalizes first letter of each word irrespective of articles, conjunctions or prepositions if string is no greater than two words long', function(){
    expect(toTitleCase('the dog')).to.equal('The Dog'); // Capitalize articles when only two words long
    expect(toTitleCase('for all')).to.equal('For All'); // Capitalize conjunctions when only two words long
    expect(toTitleCase('with cats')).to.equal('With Cats'); // Capitalize prepositions when only two words long
  });

  it('Always capitalize first and last words in a string irrespective of articles, conjunctions or prepositions', function(){
    expect(toTitleCase('the beautiful dog')).to.equal('The Beautiful Dog');
    expect(toTitleCase('for all the deadly ninjas, be it so')).to.equal('For All the Deadly Ninjas Be It So');
    expect(toTitleCase('with cats and dogs we are near')).to.equal('With Cats and Dogs We Are Near');
  });

  it('Replace special characters with space', function(){
    expect(toTitleCase('[wolves & lions]: be careful')).to.equal('Wolves & Lions Be Careful');
    expect(toTitleCase('wolves & lions, be careful')).to.equal('Wolves & Lions Be Careful');
  });

  it('Trim whitespace at beginning and end', function(){
    expect(toTitleCase(' mario & Luigi superstar saga ')).to.equal('Mario & Luigi Superstar Saga');
  });

  it('articles, conjunctions and prepositions should not be capitalized in strings of 3  words', function(){
    expect(toTitleCase('The wolf and the lion: a tale of two like animals')).to.equal('The Wolf and the Lion a Tale of Two like Animals');
    expect(toTitleCase('the  three Musketeers  And plus ')).to.equal('The Three Musketeers and Plus');
  });
});

плагин jquery.hotkeys

Это основано на моем решении для Bonfire «Case Case» FreeCodeCamp , которое требует, чтобы вы сначала преобразовали данную строку во все строчные буквы, а затем преобразовали каждый символ, идущий через пробел, в верхний регистр.

Без использования регулярных выражений:

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');

Сначала преобразуйтеstring в массив с помощью (благодаря авторам в комментариях), это пробелами:

var words = str.split(' ');

Затем используйте Для правильного функционального программирования и создания цепочек — изобретение Многие ответы ранее показывают, что результат

var capitalized = words.map(function(word) {
    return word.charAt(0).toUpperCase()   word.substring(1, word.length);
});

Затем в элементе массива, в отличие от использования присоединитесь новым массивом с пробелами:

capitalized.join(" ");
function titleCase(str) {
  str = str.toLowerCase(); //ensure the HeLlo will become Hello at the end
  var words = str.split(" ");

  var capitalized = words.map(function(word) {
    return word.charAt(0).toUpperCase()   word.substring(1, word.length);
  });
  return capitalized.join(" ");
}

console.log(titleCase("I'm a little tea pot"));

Примечание:

простой пример

Предположительно, у вас есть:

str = "I'm a little/small tea pot";

удалит свойство объекта, но не будет переиндексировать массив или обновить его длину. Это выглядит так, как будто оно не определено:

I’m A Little / {* } IE9, IE10 tag jQuery добавить строку таблицы

Edit

Я маленький / маленький чайник

, я всегда использую его в своем проекты. . replace сделает свое дело:

с ES6:

const capitalize = str => str.length
  ? str[0].toUpperCase()  
    str.slice(1).toLowerCase()
  : '';

const escape = str => str.replace(/./g, c => `\${c}`);
const titleCase = (sentence, seps = ' _-/') => {
  let wordPattern = new RegExp(`[^${escape(seps)}] `, 'g');
  
  return sentence.replace(wordPattern, capitalize);
};
console.log( titleCase("I'm a little/small tea pot.") );

или без Есть идеи? :

function capitalize(str) {
  return str.charAt(0).toUpperCase()   str.substring(1, str.length).toLowerCase();
}

function titleCase(str) {
  return str.replace(/[^ /-_] /g, capitalize);
}

console.log(titleCase("hello/hi world"));

вот еще одно решение с использованием css (и javascript, если текст, который вы хотите преобразовать, находится в верхнем регистре):

Это довольно мало, используя ES2015 и Sets . Принимает подобные массиву значения, такие как String, и удаляет дубликаты.

<span id='text'>JOHN SMITH</span>

Следующий код отобразит «a», «b», «undefined», «d»

var str = document.getElementById('text').innerHtml;
var return_text = str.toLowerCase();

https://developers.google.com/web/updates/2018/03/clipboardapi

#text{text-transform:capitalize;}

, я наткнулся на этот вопрос, пытаясь понять, как удалить каждое вхождение элемента из массива. this github p roject С чем вы столкнулись

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(/[A-Z]|../)>-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..." ) );