Dizede büyük harf kullanımı


183

Dizgideki kelimeleri büyük harfle yazmanın en iyi yolu nedir?


66
Görüntülenecekse, CSS kullanın. text-transform:capitalize;.
kennytm

3
bu, DOM öğelerine "title" özelliğini ayarlamak için kullanılır. CSS yok :)
vsync

1
Ayrıca, bu soruyu sordum, ancak çözümü bilmeme rağmen, sadece bu web sitesinde aramaya çalıştım ve iyi bir çözüm bulamadım, bu yüzden dokümantasyon uğruna ekledim.
vsync

1
@KennyTM: metin dönüşümü, formun değerlerinin değerlerini gerçekten büyük harfle yazmaz, tüm değerler büyük harfle sunulur, ancak oldukları gibi sunucuya gönderilir.
Marco Demaio

8
@Marco: Evet, bu yüzden "Göstermek içinse" dedim.
kennytm

Yanıtlar:


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

  • düzeltmeleri Marco DeMaio bir boşluk önceki ilk harfi büyük değildir 'in çözeltisi.
capitalize(' javascript'); // -> ' Javascript'
  • ulusal sembolleri ve aksanlı harfleri işleyebilir.
capitalize('бабушка курит трубку');  // -> 'Бабушка Курит Трубку'
capitalize('località àtilacol')      // -> 'Località Àtilacol'
  • tırnak ve kaşlı ayraçlar işleyebilir.
capitalize(`"quotes" 'and' (braces) {braces} [braces]`);  // -> "Quotes" 'And' (Braces) {Braces} [Braces]

4
regexp, "dizenin başlangıcında (^) veya herhangi bir boşluk karakterinden (\ s) hemen sonra duran tüm boşluk olmayan karakterleri (\ S) alın ve bunları büyük harfle" gibi
işler

3
Büyük harf dizelerini işlemek için küçük bir geliştirme :) ** String.prototype.capitalize = function () {return this.toLowerCase (). Replace (/ (?: ^ | \ S) \ S / g, işlev (a) {dönüş a.toUpperCase ();}); }; **
SuryaPavan

1
Lütfen mevcut nesnelerin prototiplerini değiştirmeyin.
Ascherer

1
@ Dr.X, eklentiye bakın 'CHECK THIS OUT'.capitalize(true) -> "Check This Out",. Mind trueparametresi.
Ocak'ta

1
SeaWarrior404 @, sen ES6 sözdizimi, katma jsdoc ve bazı noktalama tedavi ile benim cevap güncellenir
disfated

216

Bir dize içindeki sözcükleri büyük harf yapmak için en kısa uygulama, ES6'nın ok işlevlerini kullanarak aşağıdakilerdir:

'your string'.replace(/\b\w/g, l => l.toUpperCase())
// => 'Your String'

ES5 uyumlu uygulama:

'your string'.replace(/\b\w/g, function(l){ return l.toUpperCase() })
// => 'Your String'

Normal ifade temelde verilen dize içindeki her kelimenin ilk harfiyle eşleşir ve yalnızca bu harfi büyük harfe dönüştürür:

  • \ b sözcük sınırıyla eşleşir (sözcüğün başlangıcı veya bitişi);
  • \ w şu meta karakterle [a-zA-Z0-9] eşleşir.

ASCII olmayan karakterler için bunun yerine bu çözüme başvurun

'ÿöur striñg'.replace(/(^|\s)\S/g, l => l.toUpperCase())

Bu normal ifade, belirtilen dize içindeki boşlukla başlayan ilk harf ve boşluk olmayan her harfle eşleşir ve yalnızca bu harfi büyük harfe dönüştürür:

  • \ s , boşluk karakteriyle eşleşir
  • \ S, boşluk olmayan bir karakterle eşleşir
  • (x | y) belirtilen alternatiflerin herhangi biriyle eşleşir

Yakalamayan bir grup burada şu şekilde kullanılabilirdi, /(?:^|\s)\S/gancak gregex'imizdeki bayrak alt grupları tasarım gereği yakalamayacak.

Şerefe!


1
Cevapta normal ifadenin nasıl çalıştığını açıklayabilir misiniz? (her bir parçanın anlamı)
vsync

2
Açıklama içeride olursa cevap olarak seçeceğim ve bir yorum olarak kaçırmayın.
vsync

2
Bu, ä, ö ve å nordic karakterleri için işe yaramıyor gibi görünüyor. Örneğin päijät-hämeolurPäIjäT-HäMe
Markus Meskanen

1
Bu çözüm, aksan / latin olmayan karakterler içeren uluslararası içerik için iyi bir çözüm değildir. EisbäRenörneğin bir sonuçtur.
Daniel B.10

3
@MarkusMeskanen'den örnek değişmelidir Päijät-Häme, ancak en azından Chrome boşlukta tire işareti (-) içermez, bu nedenle adın ikinci kısmı büyük harfle yazılmaz. Olarak sabitlenebilir /(^|\s|-)\S/g.
MiRin

34
function capitalize(s){
    return s.toLowerCase().replace( /\b./g, function(a){ return a.toUpperCase(); } );
};

capitalize('this IS THE wOrst string eVeR');

çıktı: "Bu şimdiye kadarki en kötü dize"

Güncelleme:

Bu çözüm benimkinin yerini alıyor gibi görünüyor: https://stackoverflow.com/a/7592235/104380


fonksiyonunuzun aksanlı harfleri yanlış yazdığını görün, cevabımı görün: stackoverflow.com/questions/2332811/capitalize-words-in-string/… Ben de prototip yaptım.
Marco Demaio

9
Prototiplemekten hoşlanmıyorum, çarpışma yaratma potansiyeli var, başka biri de String'i prototiplemek için aynı adı kullanıyor.
vsync

15

Vsync tarafından verilen cevap aksanlı harfleriniz olmadığı sürece işe yarar , giriş dizesinde .

Nedenini bilmiyorum, ama görünüşe göre \bregexp de aksanlı harf eşleşir (IE8 ve Chrome üzerinde test edilmiştir), bu yüzden gibi bir dize "località"yanlış büyük harfle"LocalitÀ" (à mektup büyük harfle yazılır, çünkü normal ifade bunun bir kelime sınırı olduğunu düşünür)

Aksanlı harflerle de çalışan daha genel bir işlev şudur :

String.prototype.toCapitalize = function()
{ 
   return this.toLowerCase().replace(/^.|\s\S/g, function(a) { return a.toUpperCase(); });
}

Bu şekilde kullanabilirsiniz:

alert( "hello località".toCapitalize() );

1
" javascript".toCapitalize() -> " javascript"
03'te disfate

2
KİMLERLE İLGİLİ OLABİLİR: disfated cevap stackoverflow.com/questions/2332811/capitalize-words-in-string/… şimdi burada en iyi cevap.
Marco Demaio

4

Herkes istediğin JavaScript cevabını verdiğinden, CSS özelliğinin text-transform: capitalizetam olarak bunu yapacağını söyleyeceğim.

Bunu gerçekleştirmek kudreti bize bunu çalıştıran hangi bağlamda herhangi vermediyseniz - - Neden soruyorsun olmayabilir ama sadece sunum için ise, kesinlikle CSS alternatif gider.


KennyTM seni dövdü. Soru bölümündeki yorumunu kontrol edin. :-)
Buhake Sindi

Evet, bu CSS özniteliğini biliyorum, ancak dom öğelerine başlık özniteliği için buna ihtiyacım var ve bildiğiniz gibi hiç CSS yok.
vsync

4

John Resig (jQuery şöhretinden) John Gruber tarafından yazılmış bir perl betiğini JavaScript'e taşıdı. Bu senaryo daha akıllı bir şekilde büyük harf kullanır, örneğin 've' ve 'gibi küçük kelimeleri büyük harfle yazmaz.

Burada bulabilirsiniz: JavaScript'te Başlık Büyük Harf Kullanımı


4

JavaScript ve html kullanma

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>

Temel olarak, yapabilirsiniz string.capitalize()ve her kelimenin her 1 harfini büyük yazacaktır.

Kaynak: http://www.mediacollege.com/internet/javascript/text/case-capitalize.html


1
Ben bu şekilde prototipleme hayranı değilim, çünkü scriptlerim bazen diğer web sitelerine 3. parti gömüyor ve bu "String" gibi global nesne ile karışıklık neden olabilir ... bu yüzden bunun yerine "fucntion" tercih ederim.
vsync

1
Bu prototipin güzelliği (indirdiğiniz Prototip değil). Javascript'te standarttır ve tüm tarayıcılarda çalışır.
Buhake Sindi

Başka birinin zaten kendi String.prototype.capitalize prototipini yapması sorunlara neden olabileceğinden şüpheleniyorum ve yanlışlıkla onu geçersiz kılacağım.
vsync

1
@vsync, bunu her zaman kontrol edebilirsiniz. if (object.capitalize) {...} else {String.prototype.capitalize = function()....}burada nesne türündedir String. Yani, gerçekten oldukça basit.
Buhake Sindi

4

Ivo'nun cevabı iyi, ama eşleşmemeyi tercih ediyorum \wçünkü 0-9 ve AZ'den büyük harf kullanmanıza gerek yok. Bunları görmezden gelebilir ve sadece az ile eşleşebiliriz.

'your string'.replace(/\b[a-z]/g, match => match.toUpperCase())
// => 'Your String'

Aynı çıktı, ama kendi kendini belgeleme kodu açısından daha net düşünüyorum.


Bu sigara ingilizce harf için başarısız olur: "Är Toaletten". Çok iyi cevap verildikten yıllar sonra cevabınız tartışmaya katkıda bulunmuyor ..
vsync

@vsync oldukça sert görünüyor. kabul edilen cevaba bir optimizasyondur. /\b\w/gİngilizce olmayan mektuplar için de başarısız olur. Herkes unicode karakterlerle uğraşmaz ve bu yapmak istemeyenlere yardımcı olur.
Büyük Para

1
Pekala .. Ben sadece İngilizce dışında başka bir dile ihtiyacınız olmadığı için bunu en iyi cevap yerine kullanmanız gerektiğini düşünmüyorum. En iyi soruda belirtildiği gibi tüm ASCII karakterleri için bir ceza olmadığı için bu yeterli bir gerekçe değil
vsync

3

Eğer kullanıyorsanız lodash JavaScript uygulamasında, Sen kullanabilirsiniz _.capitalize :

console.log( _.capitalize('ÿöur striñg') );
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"></script>


3

Kısa bir ES6 yapmanın yolu böyle görünebilir.

const capitalizeFirstLetter = s => s.charAt(0).toUpperCase() + s.slice(1)

Bu sadece ilk harfin üstünü kaplar ve cümlenin geri kalanını etkilemez.


2

Çözümüm:

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

Misal:

'álL riGht'.toCapital();
// Returns 'Áll Right'

Birkaç yöntem deneyin ve çözümünüz en verimli olanıdır ve jsbench.me/urjeu9wvql
29'da nasatome

Bu işe yaramaz: 'a áAA. bb . bbb .cc .d'.toCapital();=>a Áaa. bb . Bbb .cc .d
vsync

Bunu "of", "as" gibi 2 harften daha az kelime ile düşünmemeyi başardım.
Erick Tatsui

1

Bu, en temel kullanım durumlarını kapsamalıdır.

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

Düzenleme: Geliştirilmiş haritalama okunabilirliği.


Cevabınızın neden yıllar önce diğerlerinden daha iyi olduğunu düşünüyorsunuz?
vsync

Cevabımın neden diğerlerinden daha iyi / veya daha iyi olduğunu kastettiğimi düşündünüz mü? Bundan bahsetmedim, sadece farklı. Ayrıca diğer yorumlarda bu yorumu bıraktığını görmedim, bu yüzden gerçekten anlamıyorum. Ancak yeni başlayanlar için: moderns js özelliklerini (yıkım, şişman ok, örtük dönüş) kullanır, regx kullanmaz ve soruna daha işlevsel bir yaklaşımdır. Ayrıca çok temel bir hata işleme vardır ve bir (eğer bana önemli) geçirirseniz boş dize döndürür.
Damla

farklı olmak için sorun değil ama diğer cevaplara eşit ya da daha iyi olmalı ve okunamayacak gibi görünüyor ve kesinlikle kimse üretim koduna
koyamazdı

Ahhh tamam, bu yüzden hangi monkeypatch String'i burada üreteceğiniz çözümlerin% 50'si? Ya da belki kıvrık düzenli ifade ifadeleri? Bunlarla mantık yürütmek çok daha kolay, değil mi? Imho kesinlikle değil! Ayrıca kimsenin bunu anlamayacağını söylemek oldukça öznel bir ifadedir. Ayrıca bunun için o (burada böyle değil daha fazla özellik ama) kod parçalanmış parça olduğunu söyledi. Peki bu nasıl parçalanır ve benim çözümüm kimse anlamayacak? Bu normal ifadeleri saat kaybetmeden çözmenin bir yolu yoktur.
Damla

Bu kod Bay Resig tarafından yazılmıştır ve sorgulanmamalıdır. Öte yandan, anonimliğiniz nedeniyle güvenilirliğiniz yoktur. Ne olursa olsun, bir Regex çözümü daha kısadır, çok daha hızlı çalışır ve Regex'in temellerinde öğrenilen herkes tarafından kolayca okunabilir. Bunda "untangle" için pek bir şey yok: /\b\w/g...
vsync

1

Bu çözüm dozu normal ifade kullanmaz, aksanlı karakterleri destekler ve hemen hemen her tarayıcı tarafından desteklenir.

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

Kullanımı:

console.log (capitalizeIt ('çao 2. Javascript programının içinde'));

Çıktı:

Çao 2. Inside Javascript Programı


1
Bu şekilde çok fazla CPU kaynağı tüketilir. JavaScript ilkel değerleri değiştirmez, bu da her işlem gerçekleştirildiğinde yeni bir tane oluşturulması anlamına gelir. "Değiştir", exempli gratia gibi yerel işlevleri kullanmak daha iyidir
Daniel Bandeira

0

http://www.mediacollege.com/internet/javascript/text/case-capitalize.html buradaki birçok yanıttan biridir.

Google, bu tür sorunlar için ihtiyacınız olan her şey olabilir.

Saf bir yaklaşım, dizeyi boşlukla ayırmak, elde edilen dizinin her elemanının ilk harfini büyük yapmak ve tekrar birleştirmek olacaktır. Bu, mevcut büyük harf kullanımını tek başına bırakır (örneğin, HTML HTML'de kalır ve Html gibi aptalca bir şey haline gelmez). Bu etkiyi istemiyorsanız, bölmeden önce dizenin tamamını küçük harfe çevirin.


0

Bu kod noktadan sonra kelimeleri büyük harfe çevirir:

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

0

Kolay süreçle gitmeyi seviyorum. Önce kolay yineleme için dizeyi Dizi olarak değiştirin, ardından harita işlevini kullanarak her sözcüğü istediğiniz gibi değiştirin.

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

0

Jquery veya Javascipt, bunu başarmak için yerleşik bir yöntem sağlamaz.

CSS test dönüşümü (text-transform: capitalize;), dizenin verilerini büyük harfle yazmaz, ekranda büyük harfli bir oluşturma gösterir.

Düz vanillaJS kullanarak bunu veri düzeyinde elde etmenin daha yasal bir yolunu arıyorsanız, bu çözümü kullanın =>

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

0

Bunu kullan:

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>


0

Bir dizedeki kelimeleri büyük harf yapmak için aşağıdakileri kullanabilirsiniz:

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;

}

0

Ayrıca locutus var: https://locutus.io/php/strings/ucwords/ ki bu şekilde tanımlayan:

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

0

Bu amaçla regex kullanırdım:

myString = '  this Is my sTring.  ';
myString.trim().toLowerCase().replace(/\w\S*/g, (w) => (w.replace(/^\w/, (c) => c.toUpperCase())));
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.