Jakie jest najlepsze podejście do wielkich liter w ciągu?
Jakie jest najlepsze podejście do wielkich liter w ciągu?
Odpowiedzi:
/**
* Capitalizes first letters of words in string.
* @param {string} str String to be modified
* @param {boolean=false} lower Whether all other letters should be lowercased
* @return {string}
* @usage
* capitalize('fix this string'); // -> 'Fix This String'
* capitalize('javaSCrIPT'); // -> 'JavaSCrIPT'
* capitalize('javaSCrIPT', true); // -> 'Javascript'
*/
const capitalize = (str, lower = false) =>
(lower ? str.toLowerCase() : str).replace(/(?:^|\s|["'([{])+\S/g, match => match.toUpperCase());
;
capitalize(' javascript'); // -> ' Javascript'
capitalize('бабушка курит трубку'); // -> 'Бабушка Курит Трубку'
capitalize('località àtilacol') // -> 'Località Àtilacol'
capitalize(`"quotes" 'and' (braces) {braces} [braces]`); // -> "Quotes" 'And' (Braces) {Braces} [Braces]
'CHECK THIS OUT'.capitalize(true) -> "Check This Out". trueParametr umysłu .
Najkrótszą implementacją wielkich liter w ciągu jest użycie funkcji strzałek ES6:
'your string'.replace(/\b\w/g, l => l.toUpperCase())
// => 'Your String'
Implementacja zgodna z ES5:
'your string'.replace(/\b\w/g, function(l){ return l.toUpperCase() })
// => 'Your String'
Wyrażenie regularne zasadniczo dopasowuje pierwszą literę każdego słowa w danym ciągu i przekształca tylko tę literę na wielkie litery:
'ÿöur striñg'.replace(/(^|\s)\S/g, l => l.toUpperCase())
Ten wyrażenie regularne dopasowuje pierwszą literę i każdą literę niebiałą poprzedzoną spacją w danym ciągu i przekształca tylko tę literę na wielkie litery:
Grupę, której nie udało się przechwycić, można wykorzystać tutaj w następujący sposób /(?:^|\s)\S/g chociaż gflaga w naszym wyrażeniu regularnym nie będzie przechwytywać podgrup według projektu.
Twoje zdrowie!
päijät-hämestaje sięPäIjäT-HäMe
EisbäRenjest na przykład jeden wynik.
Päijät-Häme, ale przynajmniej w Chrome białe znaki nie zawierają myślnika (-), więc druga część nazwy nie jest pisana wielkimi literami. Może być ustawiony jako /(^|\s|-)\S/g.
function capitalize(s){
return s.toLowerCase().replace( /\b./g, function(a){ return a.toUpperCase(); } );
};
capitalize('this IS THE wOrst string eVeR');
wyjście: „To najgorszy ciąg w historii”
Wygląda na to, że to rozwiązanie zastępuje moje: https://stackoverflow.com/a/7592235/104380
Odpowiedź udzielana przez vsync działa tak długo, jak nie masz litery alfabetu w ciągu wejściowego.
Nie znam powodu, ale najwyraźniej \bw wyrażeniach regularnych dopasowuje również litery akcentowane (testowane na IE8 i Chrome), więc ciąg taki "località"zostałby nieprawidłowo zamieniony na wielkie litery zamienione na"LocalitÀ" ( àlitera jest pisana wielkimi literami, ponieważ regexp myśli, że to granica słowa)
Bardziej ogólną funkcją, która działa również z literami akcentowanymi, jest ta:
String.prototype.toCapitalize = function()
{
return this.toLowerCase().replace(/^.|\s\S/g, function(a) { return a.toUpperCase(); });
}
Możesz użyć tego w następujący sposób:
alert( "hello località".toCapitalize() );
" javascript".toCapitalize() -> " javascript"
Ponieważ wszyscy udzielili ci odpowiedzi JavaScript, o którą prosiłeś, dodam, że właściwość CSS text-transform: capitalizezrobi dokładnie to.
Zdaję sobie sprawę, że może nie o to prosisz - nie podałeś nam żadnego kontekstu, w którym to uruchamiasz - ale jeśli chodzi tylko o prezentację, zdecydowanie wybrałbym alternatywę CSS.
John Resig (znany z jQuery) przeniósł skrypt JavaScript napisany przez Johna Grubera na JavaScript. Ten skrypt używa wielkich liter w sposób bardziej inteligentny, nie używa wielkich liter takich jak na przykład „of” i „and”.
Można go znaleźć tutaj: Wielkie litery w JavaScript
Za pomocą JavaScript i 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>
Zasadniczo możesz to zrobić, string.capitalize()a każda litera każdego słowa będzie pisana wielką literą.
Źródło: http://www.mediacollege.com/internet/javascript/text/case-capitalize.html
if (object.capitalize) {...} else {String.prototype.capitalize = function()....}gdzie obiekt jest typu String. To naprawdę bardzo proste.
Odpowiedź Ivo jest dobra, ale wolę się nie zgadzać, \wponieważ nie ma potrzeby używania wielkich liter 0-9 i AZ. Możemy je zignorować i pasować tylko do az.
'your string'.replace(/\b[a-z]/g, match => match.toUpperCase())
// => 'Your String'
Jest to ten sam wynik, ale myślę, że jest jaśniejszy pod względem kodu samodokumentującego.
"Är Toaletten". Twoja odpowiedź, wiele lat po udzieleniu bardzo dobrej odpowiedzi, nie przyczynia się do dyskusji.
/\b\w/gzawiesza się również w przypadku liter innych niż angielski. Nie wszyscy mają do czynienia ze znakami Unicode, a to pomoże tym, którzy tego nie chcą.
console.log( _.capitalize('ÿöur striñg') );
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"></script>
Zwięzły sposób na wykonanie tego w ES6 może wyglądać mniej więcej tak.
const capitalizeFirstLetter = s => s.charAt(0).toUpperCase() + s.slice(1)
To tylko wielkie litery pierwszej litery i nie wpływa na resztę wielkości zdania.
Moje rozwiązanie:
String.prototype.toCapital = function () {
return this.toLowerCase().split(' ').map(function (i) {
if (i.length > 2) {
return i.charAt(0).toUpperCase() + i.substr(1);
}
return i;
}).join(' ');
};
Przykład:
'álL riGht'.toCapital();
// Returns 'Áll Right'
'a áAA. bb . bbb .cc .d'.toCapital();=>a Áaa. bb . Bbb .cc .d
Powinno to obejmować najbardziej podstawowe przypadki użycia.
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
Edycja: Poprawiona czytelność mapowania.
/\b\w/g...
Ta dawka rozwiązania nie używa wyrażenia regularnego, obsługuje znaki akcentowane, a także obsługiwana przez prawie każdą przeglądarkę.
function capitalizeIt(str) {
if (str && typeof(str) === "string") {
str = str.split(" ");
for (var i = 0, x = str.length; i < x; i++) {
if (str[i]) {
str[i] = str[i][0].toUpperCase() + str[i].substr(1);
}
}
return str.join(" ");
} else {
return str;
}
}
Stosowanie:
console.log (capitalizeIt ('çao 2nd inside program JavaScript'));
Wynik:
2ndao 2nd Inside Javascript Program
http://www.mediacollege.com/internet/javascript/text/case-capitalize.html jest jedną z wielu dostępnych odpowiedzi.
Google może być wszystkim, czego potrzebujesz do takich problemów.
Naiwnym podejściem byłoby dzielenie łańcucha przez spację, pisanie wielką literą każdego elementu wynikowej tablicy i łączenie jej z powrotem. Pozostawia to istniejące wielkie litery (np. HTML pozostaje HTMLem i nie staje się czymś głupim jak HTML). Jeśli nie chcesz, aby to wpłynęło, zmień cały łańcuch na małe litery przed podzieleniem.
W tym kodzie wielkie litery są kropkowane:
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;
}
Lubię iść z łatwym procesem. Najpierw zmień ciąg znaków na tablicę, aby ułatwić iterację, a następnie za pomocą funkcji mapy zmień każde słowo tak, jak chcesz.
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;
}
Jquery lub JavaScript nie zapewnia wbudowanej metody osiągnięcia tego celu.
Transformacja testowa CSS (transformacja tekstu: wielkie litery;) tak naprawdę nie kapitalizuje danych ciągu, ale pokazuje renderowanie wielkich liter na ekranie.
Jeśli szukasz bardziej uzasadnionego sposobu osiągnięcia tego na poziomie danych za pomocą zwykłego vanillaJS, użyj tego rozwiązania =>
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);
}
}
Użyj tego:
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>
Możesz użyć następujących słów, aby wpisać wielkie litery w ciągu:
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;
}
Istnieje również locutus: https://locutus.io/php/strings/ucwords/, który definiuje to w ten sposób:
function ucwords(str) {
// discuss at: http://locutus.io/php/ucwords/
// original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
// improved by: Waldo Malqui Silva (http://waldo.malqui.info)
// improved by: Robin
// improved by: Kevin van Zonneveld (http://kvz.io)
// bugfixed by: Onno Marsman (https://twitter.com/onnomarsman)
// bugfixed by: Cetvertacov Alexandr (https://github.com/cetver)
// input by: James (http://www.james-bell.co.uk/)
// example 1: ucwords('kevin van zonneveld')
// returns 1: 'Kevin Van Zonneveld'
// example 2: ucwords('HELLO WORLD')
// returns 2: 'HELLO WORLD'
// example 3: ucwords('у мэри был маленький ягненок и она его очень любила')
// returns 3: 'У Мэри Был Маленький Ягненок И Она Его Очень Любила'
// example 4: ucwords('τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός')
// returns 4: 'Τάχιστη Αλώπηξ Βαφής Ψημένη Γη, Δρασκελίζει Υπέρ Νωθρού Κυνός'
return (str + '').replace(/^(.)|\s+(.)/g, function ($1) {
return $1.toUpperCase();
});
};
W tym celu użyłbym wyrażenia regularnego:
myString = ' this Is my sTring. ';
myString.trim().toLowerCase().replace(/\w\S*/g, (w) => (w.replace(/^\w/, (c) => c.toUpperCase())));
text-transform:capitalize;.