Каков наилучший подход к использованию слова в строке?
Заглавные слова в строке
Ответ 1
Кратчайшая реализация заглавных слов в строке - это использование функций стрелок ES6:
'your string'.replace(/\b\w/g, l => l.toUpperCase())
// => 'Your String'
ES5 совместимая реализация:
'your string'.replace(/\b\w/g, function(l){ return l.toUpperCase() })
// => 'Your String'
Регулярное выражение в основном соответствует первой букве каждого слова в данной строке и преобразует только эту букву в верхний регистр:
- \ b соответствует границе слова (начало или конец слова);
- \ w соответствует следующему метасимволу [a-zA-Z0-9].
Для не-ASCII символов обратитесь к этому решению вместо
'ÿöur striñg'.replace(/(^|\s)\S/g, l => l.toUpperCase())
Это регулярное выражение соответствует первой букве и каждой непробельной букве, которой предшествует пробел в данной строке, и преобразует только эту букву в верхний регистр:
- \ s соответствует пробелу
- \ S соответствует непробельному символу
- (x | y) соответствует любой из указанных альтернатив
Неконтролирующая группа могла бы использоваться здесь следующим образом /(?:^|\s)\S/g
хотя флаг g
в нашем регулярном выражении в любом случае не будет захватывать подгруппы.
Ура!
Ответ 2
String.prototype.capitalize = function() {
return this.replace(/(?:^|\s)\S/g, function(a) { return a.toUpperCase(); });
};
Применение:
'your string'.capitalize(); // -> 'Your String'
-
исправляет решение Marco Demaio, где первая буква с предшествующим пробелом не заглавная.
' javascript'.capitalize(); // -> ' Javascript'
-
может обрабатывать национальные символы и буквы с акцентом.
'бабушка курит трубку'.capitalize(); // -> 'Бабушка Курит Трубку' 'località àtilacol'.capitalize() // -> 'Località Àtilacol'
ADD-ON Я считаю это полезным
String.prototype.capitalize = function(lower) {
return (lower ? this.toLowerCase() : this).replace(/(?:^|\s)\S/g, function(a) { return a.toUpperCase(); });
};
'javaSCrIPT'.capitalize(); // -> 'JavaSCrIPT'
'javaSCrIPT'.capitalize(true); // -> 'Javascript'
Ответ 3
function capitalize(s){
return s.toLowerCase().replace( /\b./g, function(a){ return a.toUpperCase(); } );
};
capitalize('this IS THE wOrst string eVeR');
вывод: "Это самая худшая строка"
Обновление:
Похоже, это решение заменяет мою: fooobar.com/questions/60696/...
Ответ 4
Ответ предоставляемый vsync, работает , если в строке ввода нет букв.
Я не знаю причину, но, по-видимому, \b
в regexp соответствует также ударным буквам (проверен на IE8 и Chrome), поэтому строка типа "località"
будет ошибочно заглавной, конвертирована в "LocalitÀ"
(буква à
получает заглавные буквы, потому что регулярное выражение думает, что это граница слова)
Более общая функция, которая работает также с акцентированными буквами, такова:
String.prototype.toCapitalize = function()
{
return this.toLowerCase().replace(/^.|\s\S/g, function(a) { return a.toUpperCase(); });
}
Вы можете использовать его следующим образом:
alert( "hello località".toCapitalize() );
Ответ 5
Использование JavaScript и html
String.prototype.capitalize = function() {
return this.replace(/(^|\s)([a-z])/g, function(m, p1, p2) {
return p1 + p2.toUpperCase();
});
};
<form name="form1" method="post">
<input name="instring" type="text" value="this is the text string" size="30">
<input type="button" name="Capitalize" value="Capitalize >>" onclick="form1.outstring.value=form1.instring.value.capitalize();">
<input name="outstring" type="text" value="" size="30">
</form>
Ответ 6
Поскольку каждый дал вам ответ на JavaScript, о котором вы просили, я добавлю, что свойство CSS text-transform: capitalize
будет делать именно это.
Я понимаю, что это может быть не то, о чем вы просите - вы не предоставили нам какой-либо контекст, в котором вы это используете, но если он просто для презентации, я бы определенно пошел с альтернативой CSS.
Ответ 7
Джон Ресиг (из славы jQuery) портировал Perl script, написанный Джоном Грубером, на JavaScript. Этот script использует более интеллектуальный способ, он не использует малые слова, такие как "из" и "и", например.
Вы можете найти его здесь: Заглавие заголовка в JavaScript
Ответ 8
Если вы используете lodash в своем приложении JavaScript, вы можете использовать _.capitalize:
console.log( _.capitalize('ÿöur striñg') );
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"></script>
Ответ 9
Мое решение:
String.prototype.toCapital = function () {
return this.toLowerCase().split(' ').map(function (i) {
if (i.length > 2) {
return i.charAt(0).toUpperCase() + i.substr(1);
} else {
return i;
}
}).join(' ');
};
Пример:
'álL riGht'.toCapital();
// Returns 'Áll Right'
Ответ 10
Это должно охватывать большинство основных случаев использования.
const capitalize = (str) => {
if (typeof str !== 'string') {
throw Error('Feed me string')
} else if (!str) {
return ''
} else {
return str
.split(' ')
.map(s => {
if (s.length == 1 ) {
return s.toUpperCase()
} else {
const firstLetter = s.split('')[0].toUpperCase()
const restOfStr = s.substr(1, s.length).toLowerCase()
return firstLetter + restOfStr
}
})
.join(' ')
}
}
capitalize('THIS IS A BOOK') // => This Is A Book
capitalize('this is a book') // => This Is A Book
capitalize('a 2nd 5 hour boOk thIs weEk') // => A 2nd 5 Hour Book This Week
Изменение: Улучшена читаемость отображения.
Ответ 11
Краткий ES6 способ сделать это может выглядеть примерно так.
const capitalizeFirstLetter = s => s.charAt(0).toUpperCase() + s.slice(1)
Это только заглавные буквы первой буквы и не влияет на остальную часть предложения.
Ответ 12
http://www.mediacollege.com/internet/javascript/text/case-capitalize.html является одним из многих ответов.
Google может быть всем, что вам нужно для таких проблем.
Наивный подход состоит в том, чтобы разбить строку на пробел, загладить первую букву каждого элемента результирующего массива и объединить его обратно. Это оставляет только существующую капитализацию (например, HTML остается HTML и не становится чем-то глупым, как Html). Если вы не хотите, чтобы это повлияло, переверните всю строку в нижний регистр, прежде чем раскалывать ее.
Ответ 13
Этот код заглавные слова после точки:
function capitalizeAfterPeriod(input) {
var text = '';
var str = $(input).val();
text = convert(str.toLowerCase().split('. ')).join('. ');
var textoFormatado = convert(text.split('.')).join('.');
$(input).val(textoFormatado);
}
function convert(str) {
for(var i = 0; i < str.length; i++){
str[i] = str[i].split('');
if (str[i][0] !== undefined) {
str[i][0] = str[i][0].toUpperCase();
}
str[i] = str[i].join('');
}
return str;
}
Ответ 14
Мне нравится идти с легким процессом. Сначала измените строку в Array для упрощения итерации, а затем с помощью функции карты измените каждое слово так, как вы хотите.
function capitalizeCase(str) {
var arr = str.split(' ');
var t;
var newt;
var newarr = arr.map(function(d){
t = d.split('');
newt = t.map(function(d, i){
if(i === 0) {
return d.toUpperCase();
}
return d.toLowerCase();
});
return newt.join('');
});
var s = newarr.join(' ');
return s;
}
Ответ 15
Jquery или Javascipt не обеспечивают встроенный метод для достижения этого.
Преобразование теста CSS (text-transform: capitalize;) на самом деле не капитализирует строковые данные, а отображает заглавную визуализацию на экране.
Если вы ищете более законный способ достижения этого на уровне данных с помощью простой vanillaJS, используйте это решение = >
var capitalizeString = function (word) {
word = word.toLowerCase();
if (word.indexOf(" ") != -1) { // passed param contains 1 + words
word = word.replace(/\s/g, "--");
var result = $.camelCase("-" + word);
return result.replace(/-/g, " ");
} else {
return $.camelCase("-" + word);
}
}
Ответ 16
Использовать этот:
String.prototype.toTitleCase = function() {
return this.charAt(0).toUpperCase() + this.slice(1);
}
let str = 'text';
document.querySelector('#demo').innerText = str.toTitleCase();
<div class = "app">
<p id = "demo"></p>
</div>
Ответ 17
Вы можете использовать следующее для прописных слов в строке:
function capitalizeAll(str){
var partes = str.split(' ');
var nuevoStr = "";
for(i=0; i<partes.length; i++){
nuevoStr += " "+partes[i].toLowerCase().replace(/\b\w/g, l => l.toUpperCase()).trim();
}
return nuevoStr;
}