Есть ли простой способ конвертировать строку в заголовок? Например john smith
становится John Smith
. Я не ищу чего-то сложного, такого как решение Джона Резига , просто (надеюсь) какой-то одно- или двухслойный.
javascript
title-case
MDCore
источник
источник
Ответы:
Попробуй это:
источник
\w\S*
используется, а не\w+
или,\w*
например? Я не знаю, почему вы захотите включить что-нибудь, кроме пробелов, и поэтому измените Джим-Боб на Джим-боб .\w\S*
также вызвалJim-bob
проблему с нашей стороны. Использование\w*
решило это./([^\W_]+[^\s-]*) */g
решаетJim-Bob
проблему, т.е.:jim-bob
-->
Jim-Bob
jim-bob
-->
Jim-Bob
это ваше желание, вы, вероятно, должны сделать/\b\w+/g
. Пример:str.replace(/\b\w+/g,function(s){return s.charAt(0).toUpperCase() + s.substr(1).toLowerCase();});
\w\S*
используется вместо\w+
или\w*
так, чтобы слова вродеDon't
не изменялисьDon'T
, но, как указывали другие,\w\S*
вызывает проблемы с переносами слов.Немного более элегантный способ, адаптирующий функцию Грега Дина:
Назовите это как:
источник
Jo-Ann Smith
, этот код преобразует его вJo-ann Smith
(обратите внимание на нижний регистрa
вAnn
).Попробуйте применить CSS-стиль для преобразования текста к элементам управления.
например:
(text-transform: capitalize);
Используйте подход JS только тогда, когда это абсолютно необходимо.
источник
Вот моя версия, ИМО, это легко понять и элегантно.
источник
str.split(' ').map(i => i[0].toUpperCase() + i.substring(1).toLowerCase()).join(' ')
.toLowerCase()
. Имена, такие как «McDonald» или аббревиатуры, такие как «ASAP», должны сохранять заглавные буквы. Если кто-то фактически передал строку типа «heLLO», приложение не должно предполагать, что заглавные буквы неверны.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
будет один символ.Вот моя функция, которая преобразует в регистр заглавия, но также сохраняет определенные аббревиатуры в верхнем регистре и второстепенные слова в нижнем регистре:
Например:
источник
/\w\S*/g
на/([^\W_]+[^\s-]*) */g
на @ awashburn замечании выше для решения этой проблемы ./\b\w+/g
, который я считаю более быстрым?/([^\W_]+[^\s-]*) */g
до/\b\w+/g
пер @ комментарий Майкла; пожалуйста, прокомментируйте, если вы найдете случай, когда необходимо более сложное регулярное выражение./\b[\w-\']+/g
, чтобы разрешить переносить слова и апостроф в словах.Я предпочитаю следующее над другими ответами. Он соответствует только первой букве каждого слова и заглавными буквами. Более простой код, легче для чтения и меньше байтов. Он сохраняет существующие заглавные буквы для предотвращения искажений аббревиатур. Однако вы всегда
toLowerCase()
можете сначала вызвать вашу строку.Вы можете добавить это к вашему прототипу строки, что позволит вам сделать
'my string'.toTitle()
следующее:Пример:
Показать фрагмент кода
источник
const titleCase = (str) => str.replace(/\b\S/g, t => t.toUpperCase());
NoT qUiITe
.toLowerCase
. Просто знайте, что это нарушит аббревиатуры.an HTML document
:An HTML Document
vsAn Html Document
toLowerCase
) является более гибким / полезным, чем тот, который предполагает намерения разработчиков. Этот метод также отражает функциональность аналогичных встроенных методов других языков, таких как PHP (ucwords
) и Golang (strings.Title
). .NET (TextInfo.ToTitleCase
) интересно работает в смешанном регистре, но также оставит полностью заглавные строки без изменений.Без использования регулярных выражений только для справки:
источник
источник
'string'.replace(/^(.)(.*)/,function(s,p1,p2){return p1.toUpperCase()+p2;})
Опять же, это работает только для заглавных букв первой буквы строки, но в случае, если это то, что вам нужно, моя конструкция работает.'$1'.toUpperCase()
, кажется, что заглавные буквы не были сделаны к моменту назначения значения.'string'.replace(/^(.){1}/,function(match) { return match.toUpperCase(); })
Вы можете сразу
toLowerCase
строку, а затем толькоtoUpperCase
первую букву каждого слова. Становится очень простым 1 вкладышем:источник
s => s.toUpperCase()
). Мой вариант делать то , что вы сделали, но расширения объекта String (как спорный , как есть):Object.defineProperty(String.prototype, '_toProperCase', {value:function() {return this.toLowerCase().replace(/\b(\w)/g, function(t) {return t.toUpperCase()})}})
=>
, что это встроенная функция стрелок (ES6), ссылка переходит к документам Mozillla на них, которая также предоставляет таблицу поддержки.На всякий случай, если вас волнуют эти слова-наполнители, вы всегда можете просто сказать функции, что не использовать заглавные буквы.
Надеюсь, что это помогает вам.
редактировать
Если вы хотите обработать начальные связующие слова, вы можете отслеживать эту w / еще одну переменную:
источник
glue ='de|da|del|dos|do|das|des|la|della|delli'.split('|');
and another thing
становитсяand Another Thing
. Просто нужен элегантный способ всегда использовать первое слово с большой буквы.Если регулярное выражение, используемое в приведенных выше решениях, вводит вас в заблуждение, попробуйте этот код:
источник
split
действительно конвертирует его в массив, вы просто не видите это так очевидно, потому чтоmap
означает, что вам не нужно использовать[]
нотациюЯ сделал эту функцию, которая может обрабатывать фамилии (так что это не случай названия), такие как «Макдональд» или «Макдональд» или «О'Тул» или «Д'Орацио». Однако он не обрабатывает немецкие или голландские имена с "van" или "von", которые часто пишутся в нижнем регистре ... Я считаю, что "de" тоже часто в нижнем регистре, например, "Robert de Niro". Эти вопросы все еще должны быть решены.
источник
macy
проблему, положив туда негативную\b((m)(a?c))?(\w)
\b((m)(a?c))?(\w)(?!\s)
Кажется, работает ... Протестировано с вышеупомянутым, "быстрый коричневый, лиса? / Прыжки / ^ над ^ ленивый! Собака ..." и "C: / программные файлы / какой-то поставщик / их второе приложение / а file1.txt».
Если вы хотите 2-й вместо 2-го, вы можете изменить на
/([a-z])(\w*)/g
.Первая форма может быть упрощена как:
источник
Попробуй это
пример
источник
Если вы можете использовать сторонние библиотеки в своем коде, тогда у lodash есть вспомогательная функция для нас.
https://lodash.com/docs/4.17.3#startCase
источник
Попробуйте это, кратчайший путь:
источник
ES 6
еще
источник
s.slice(0, 1).toUpperCase()
если вы все еще хотите эту первую букву.str
- одиночный персонаж.charAt(0).toUpperCase()
.Большинство этих ответов, похоже, игнорируют возможность использования метасимвола границы слова (\ b). Более короткая версия ответа Грега Дина, использующего его:
Работает для дефисных имен, таких как Джим-Боб тоже.
источник
\w
включает в себя только символы[A-Za-z0-9_]
, а не все буквы. Для этого вам нужно использовать категорию Unicode\p{L}
. Вам понадобится/u
модификатор (см. Здесь ) и другое решение\b
, которое работает только между\W
и\w
(см. Здесь )Я думаю, что самым простым является использование CSS.
источник
Используйте
/\S+/g
для поддержки диакритических знаков:Однако: " s unshine ( y ellow)" ⇒ " S unshine ( y ellow)"
источник
Я хотел добавить свой собственный ответ, так как мне нужна надежная
toTitleCase
функция, которая учитывает правила грамматики, перечисленные здесь (статья, рекомендованная Google). Существуют различные правила, которые зависят от длины входной строки. Ниже приведена функция + модульные тесты.Функция также объединяет пробелы и удаляет специальные символы (измените регулярное выражение для ваших нужд)
Функция toTitleCase
Модульные тесты для проверки правильности
Обратите внимание, что я удаляю довольно много специальных символов из предоставленных строк. Вам нужно будет настроить регулярное выражение в соответствии с требованиями вашего проекта.
источник
источник
o'henry
, но делает странные вещи сhorse's mouth
."john f. kennEdy".toLowerCase().replace(/\b\S/g, t => t.toUpperCase())
лучше 🤔\b
и\S
являются специальными классами символов, обозначающими «границу слова» и «один непробельный символ. Таким образом, регулярное выражение соответствует каждому отдельному символу, следующему за границей слова, и использует этот знак с большой буквы, применяя данную функцию стрелки.Используя решение «lewax00», я создал это простое решение, которое заставляет «w» начинаться с пробела или «w», которые инициируют слово, но не может удалить лишние промежуточные пробелы.
Результат "София Вергара".
источник
Вот моя функция, которая заботится об акцентированных символах (важно для французского!) И которая может включать / выключать обработку исключений более низкого уровня. Надеюсь, это поможет.
источник
У нас здесь, в офисе, было обсуждение, и мы думаем, что попытка автоматически исправить то, как люди вводят имена в том виде, в котором вы хотите, чтобы это происходило, чревата возможными проблемами.
Мы придумали несколько случаев, когда разные типы автокапитализации распадаются, и это только для английских имен, каждый язык имеет свои сложности.
Проблемы с использованием заглавных букв первой буквы каждого имени:
• Сокращения, такие как IBM, не разрешенные для ввода, превратятся в Ibm.
• Имя McDonald превратится в Mcdonald, что неверно, то же самое относится и к MacDonald.
• Двуствольные имена, такие как «Мари-Тонкс», превратятся в «Мари-Тонкс».
• Имена как О'Коннор превратятся в О'Коннор.
Для большинства из них вы могли бы написать собственные правила, чтобы справиться с этим, однако, это по-прежнему имеет проблемы с сокращениями, как и раньше, и вы получаете новую проблему:
• Добавление правила для исправления имен с Mac, таких как MacDonald, приведет к тому, что имена разрывов, такие как Macy, превратят его в MacY.
Единственное решение, которое мы придумали, которое никогда не бывает неправильным, состоит в том, чтобы использовать каждую букву с заглавной буквы, которая является методом грубой силы, который, по-видимому, также использует DBS.
Так что, если вы хотите автоматизировать процесс, это так же невозможно, как без словаря каждого отдельного имени и слова, и как оно должно быть прописным. Если у вас нет правила, которое охватывает все, не используйте его как оно будет просто раздражать ваших пользователей и предлагать людям, которые хотят правильно ввести свои имена, пойти куда-нибудь еще.
источник
Вот еще одно решение с использованием CSS (и JavaScript, если текст, который вы хотите преобразовать, в верхнем регистре):
HTML
JS
CSS
источник
Для тех из нас, кто боится регулярных выражений (смеется):
источник
Мое однострочное решение:
Затем вы можете вызвать метод
capitalizeWords()
для любой строки. Например:Мое другое решение:
Затем вы можете вызвать метод
capitalizeWords()
для любой строки. Например:Альтернативное решение на основе ответа Грега Дина:
Затем вы можете вызвать метод
capitalizeWords()
для любой строки. Например:источник
Удивило, что никто не упомянул об использовании параметра rest. Вот простой вкладыш, который использует параметры ES6 Rest.
источник
Это основано на моем решении для Bonfire FreeCodeCamp "Заголовок дела" , которое требует, чтобы вы сначала преобразовали данную строку во все строчные буквы, а затем преобразовали каждый символ, начиная с пробела, в верхний регистр.
Без использования регулярных выражений:
источник