Viết hoa các từ trong chuỗi


182

Cách tiếp cận tốt nhất để viết hoa các từ trong một chuỗi là gì?


66
Nếu nó để hiển thị, sử dụng CSS. text-transform:capitalize;.
kennytm

3
cái này được sử dụng để đặt thuộc tính "title" cho các phần tử DOM. không có CSS ​​:)
vsync

1
Ngoài ra, tôi đã hỏi câu hỏi này, mặc dù tôi biết giải pháp, chỉ vì tôi đã cố gắng tìm kiếm nó trong trang web này và không thể tìm thấy một giải pháp hợp lý, vì vậy đã thêm nó vào mục đích tài liệu.
vsync

1
@KennyTM: chuyển đổi văn bản sẽ không thực sự viết hoa các giá trị của fieds, tất cả các giá trị sẽ được viết hoa, nhưng được gửi đến máy chủ như hiện tại.
Marco Demaio

8
@Marco: Vâng, đó là lý do tại sao tôi nói "Nếu đó là để hiển thị".
kennytm

Câu trả lời:


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

  • sửa giải pháp của Marco Demaio trong đó chữ cái đầu tiên có khoảng trắng ở trước không được viết hoa.
capitalize(' javascript'); // -> ' Javascript'
  • có thể xử lý các biểu tượng quốc gia và chữ có dấu.
capitalize('бабушка курит трубку');  // -> 'Бабушка Курит Трубку'
capitalize('località àtilacol')      // -> 'Località Àtilacol'
  • có thể xử lý báo giá và niềng răng.
capitalize(`"quotes" 'and' (braces) {braces} [braces]`);  // -> "Quotes" 'And' (Braces) {Braces} [Braces]

4
regrec hoạt động như "Lấy tất cả các ký tự không phải khoảng trắng (\ S) đứng ngay đầu chuỗi (^) hoặc sau bất kỳ ký tự khoảng trắng nào (\ s) và viết hoa chúng"
biến mất

3
Một chút cải tiến để xử lý các chuỗi chữ hoa :) ** String.prototype.capitalize = function () {return this.toLowerCase (). Thay thế (/ (?: ^ | \ S) \ S / g, function (a) {trả về a.toUpperCase ();}); }; **
SuryaPavan

1
Xin đừng thay đổi nguyên mẫu của các đối tượng hiện có.
Ascherer

1
@ Dr.X, xem phần bổ trợ , 'CHECK THIS OUT'.capitalize(true) -> "Check This Out". trueTham số tâm .
biến mất

1
@ SeaWar Warrior404, bạn đã đúng, đã cập nhật câu trả lời của tôi với cú pháp es6, thêm jsdoc và một số cách xử lý dấu câu
vô hiệu hóa

216

Việc triển khai ngắn nhất để viết hoa các từ trong một chuỗi là sau bằng cách sử dụng các hàm mũi tên của ES6:

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

Triển khai tương thích ES5:

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

Regex về cơ bản khớp với chữ cái đầu tiên của mỗi từ trong chuỗi đã cho và chỉ chuyển đổi chữ cái đó thành chữ hoa:

  • \ b khớp với một ranh giới từ (bắt đầu hoặc kết thúc của từ);
  • \ w khớp với ký tự meta sau [a-zA-Z0-9].

Đối với các ký tự không phải ASCII, hãy tham khảo giải pháp này thay thế

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

Regex này khớp với chữ cái đầu tiên và mọi chữ cái không phải khoảng trắng đứng trước khoảng trắng trong chuỗi đã cho và chỉ chuyển đổi chữ cái đó thành chữ hoa:

  • \ s khớp với một ký tự khoảng trắng
  • \ S khớp với một ký tự không phải khoảng trắng
  • (x | y) phù hợp với bất kỳ giải pháp thay thế nào được chỉ định

Một nhóm không chụp có thể đã được sử dụng ở đây như sau /(?:^|\s)\S/gg cờ trong regex của chúng tôi sẽ không bắt các nhóm phụ theo thiết kế.

Chúc mừng!


1
Bạn có thể giải thích trong câu trả lời làm thế nào regex hoạt động? (ý nghĩa của từng mảnh)
vsync

2
Tôi sẽ chọn nó làm câu trả lời nếu lời giải thích nằm trong đó và không phải là một bình luận mà người ta có thể bỏ lỡ.
vsync

2
Điều này dường như không hoạt động cho các nhân vật nordic ä, ö và å. Ví dụ päijät-hämetrở thànhPäIjäT-HäMe
Markus Meskanen

1
Giải pháp này không phải là một giải pháp tốt cho nội dung quốc tế có chứa các ký tự diacritic / phi Latin. EisbäRenlà một kết quả, ví dụ.
Daniel B.

3
Ví dụ từ @MarkusMeskanen nên đổi thành Päijät-Häme, nhưng ít nhất trong khoảng trắng của Chrome không bao gồm dấu gạch ngang (-), vì vậy phần thứ hai của tên không được viết hoa. Có thể sửa như /(^|\s|-)\S/g.
MiRin

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

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

đầu ra: "Đây là chuỗi tồi tệ nhất từng có"

Cập nhật:

Nó xuất hiện giải pháp này thay thế cho tôi: https://stackoverflow.com/a/7592235/104380


xem ra rằng có vẻ như chức năng của bạn viết hoa sai chữ cái cũng có dấu, hãy xem câu trả lời của tôi: stackoverflow.com/questions/2332811/capitalize-words-in-opes/. Tôi cũng đã viết trước nó.
Marco Demaio

9
Tôi không thích tạo mẫu, nó có khả năng tạo ra va chạm là một người khác cũng đang sử dụng cùng tên với Chuỗi nguyên mẫu.
vsync

15

Câu trả lời được cung cấp bởi vsync hoạt động miễn là bạn không có chữ cái có dấu trong chuỗi đầu vào.

Tôi không biết lý do, nhưng rõ ràng các \bkết quả khớp regex cũng có các chữ cái có dấu (đã được thử nghiệm trên IE8 và Chrome), do đó, một chuỗi như "località"được viết hoa sai thành"LocalitÀ" ( àchữ cái được viết hoa vì regrec nghĩ rằng đó là ranh giới từ)

Một chức năng tổng quát hơn cũng hoạt động với các chữ cái có dấucái này:

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

Bạn có thể sử dụng nó như thế này:

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

1
" javascript".toCapitalize() -> " javascript"
biến mất

2
ĐẾN KHI NÀO CÓ THỂ QUAN TÂM: câu trả lời bị biến dạng stackoverflow.com/questions/2332811/capitalize-words-in-opes/ và bây giờ là câu trả lời tốt nhất ở đây.
Marco Demaio

4

Vì mọi người đã cho bạn câu trả lời JavaScript mà bạn đã yêu cầu, tôi sẽ gửi vào đó thuộc tính CSS text-transform: capitalize sẽ thực hiện chính xác điều này.

Tôi nhận ra đây có thể không phải là những gì bạn yêu cầu - bạn đã không cung cấp cho chúng tôi bất kỳ bối cảnh nào mà bạn đang chạy này - nhưng nếu nó chỉ để trình bày, tôi chắc chắn sẽ đi với giải pháp thay thế CSS.


KennyTM đánh bại bạn với nó. Kiểm tra bình luận của anh ấy trên phần câu hỏi. :-)
Buhake Sindi

Vâng, tôi biết thuộc tính CSS này, nhưng tôi cần thuộc tính tiêu đề này cho các phần tử dom và nó không có CSS ​​như vậy, như bạn có thể biết.
vsync

4

John Resig (danh tiếng của jQuery) đã chuyển một tập lệnh perl, được viết bởi John Gruber, sang JavaScript. Kịch bản này viết hoa theo cách thông minh hơn, nó không viết hoa các từ nhỏ như 'của' và 'và' chẳng hạn.

Bạn có thể tìm thấy nó ở đây: Viết hoa tiêu đề trong JavaScript


4

Sử dụng JavaScript và 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>

Về cơ bản, bạn có thể làm string.capitalize()và nó sẽ viết hoa mỗi chữ cái đầu tiên của mỗi từ.

Nguồn: http://www.mediacolitic.com/iNET/javascript/text/case-capitalize.html


1
Tôi không phải là người thích tạo mẫu theo cách này, bởi vì các tập lệnh của tôi đôi khi là bên thứ 3 nhúng vào các trang web khác và điều đó có thể gây rắc rối với đối tượng toàn cầu như "Chuỗi" ... vì vậy tôi thích "thay thế" nó hơn.
vsync

1
Đó là vẻ đẹp của nguyên mẫu (không phải Nguyên mẫu bạn tải xuống). Đó là tiêu chuẩn trong javascript và hoạt động trong tất cả các trình duyệt.
Buhake Sindi

Tôi nghi ngờ nó có thể gây ra vấn đề nếu ai đó đã tạo nguyên mẫu String.prototype.capitalize của riêng mình và tôi sẽ vô tình ghi đè lên nó.
vsync

1
@vsync, bạn luôn có thể kiểm tra bằng cách này. if (object.capitalize) {...} else {String.prototype.capitalize = function()....}trong đó đối tượng là loại String. Vì vậy, nó thực sự khá đơn giản.
Buhake Sindi

4

Câu trả lời của Ivo là tốt, nhưng tôi không thích kết hợp \wvì không cần viết hoa 0-9 và AZ. Chúng ta có thể bỏ qua những điều đó và chỉ phù hợp trên az.

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

Đó là cùng một đầu ra, nhưng tôi nghĩ rõ ràng hơn về mặt tự viết mã.


Điều này sẽ thất bại cho thư không tiếng Anh : "Är Toaletten". Câu trả lời của bạn, nhiều năm sau khi câu trả lời rất tốt đã được cung cấp, không đóng góp cho cuộc thảo luận ..
vsync

@vsync có vẻ khá khắc nghiệt. đó là một tối ưu hóa cho câu trả lời được chấp nhận. /\b\w/gcũng thất bại cho các chữ cái không phải tiếng Anh. Không phải ai cũng giao dịch với các ký tự unicode và điều này sẽ giúp những người không muốn.
Tiền lớn

1
Được rồi .. Tôi không nghĩ bạn nên sử dụng câu này thay vì câu trả lời hàng đầu chỉ vì bạn không cần bất kỳ ngôn ngữ nào khác ngoài tiếng Anh. Đó không phải là một lời biện minh đủ tốt vì không có hình phạt nào cho việc làm điều đó đối với tất cả các nhân vật ASCII như đã nói trong câu hỏi hàng đầu
vsync

3

Nếu bạn đang sử dụng lodash trong ứng dụng JavaScript của mình, bạn có thể sử dụng _.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

Một cách làm ES6 súc tích có thể trông giống như thế này.

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

Điều này chỉ viết hoa chữ cái đầu tiên và không ảnh hưởng đến phần còn lại của câu.


2

Giải pháp của tôi:

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

Thí dụ:

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

Hãy thử một số phương pháp và giải pháp của bạn là hiệu quả nhất và tôn trọng những điểm nhấn của tên jsbench.me/urjeu9wvql
nasatome

Điều này không hoạt động: 'a áAA. bb . bbb .cc .d'.toCapital();=>a Áaa. bb . Bbb .cc .d
vsync

Tôi đã làm cho nó không xem xét các từ có ít hơn 2 chữ cái, như "của", "là".
Erick Tatsui

1

Điều này sẽ bao gồm hầu hết các trường hợp sử dụng cơ bản.

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

Chỉnh sửa: Cải thiện khả năng đọc bản đồ.


Bạn có thể giải thích tại sao bạn nghĩ rằng câu trả lời của bạn tốt hơn những câu hỏi khác từ nhiều năm trước không?
vsync

Bạn có thể giải thích tại sao bạn nghĩ rằng tôi có nghĩa là câu trả lời của tôi là tốt nhất / hoặc tốt hơn so với những người khác? Tôi đã không đề cập rằng, nó chỉ khác nhau. Ngoài ra tôi không thấy bạn để lại bình luận này trên các bài đăng khác, vì vậy tôi thực sự không nhận được nó. Nhưng đối với người mới bắt đầu: nó sử dụng các tính năng js hiện đại (phá hủy, mũi tên béo, hoàn trả ngầm), nó không sử dụng regx và đó là một cách tiếp cận chức năng hơn cho vấn đề. Ngoài ra, nó có xử lý lỗi rất cơ bản và trả về chuỗi rỗng nếu bạn chuyển nó một chuỗi (với tôi đó là điều quan trọng).
Rớt

Không có gì khác biệt nhưng nó phải tốt hơn hoặc bằng với các câu trả lời khác, và dường như là ... không thể đọc được và chắc chắn không ai có thể đưa vào mã sản xuất vì không ai có thể hiểu được
vsync

Ahhh ok, vậy 50% giải pháp ở đây chuỗi khỉ nào bạn thực sự sẽ đưa vào sản xuất? Hoặc có thể biểu thức regex phức tạp? Đó là những lý do dễ dàng hơn nhiều, phải không? Imho hoàn toàn không! Cũng nói rằng không ai sẽ hiểu đây là tuyên bố khá chủ quan. Ngoài ra , bạn đã nói rằng đó là đoạn mã được băm nhỏ (nhiều tính năng hơn nhưng đó không phải là trường hợp ở đây). Làm thế nào mà nó được cắt nhỏ và giải pháp của tôi sẽ không ai hiểu được? Không có cách nào bạn sẽ gỡ rối các biểu thức đó mà không mất hàng giờ.
Rớt

Mã đó được viết bởi chính ông Resig và không nên đặt câu hỏi. Mặt khác, bạn thiếu sự tin cậy, do sự ẩn danh của bạn. Bất kể, một giải pháp Regex ngắn hơn, chạy nhanh hơn nhiều và cũng dễ dàng được đọc bởi bất kỳ ai đã học trong những điều cơ bản của Regex. Hầu như không có nhiều thứ để "gỡ rối" trong việc này: /\b\w/g...
vsync

1

Liều giải pháp này không sử dụng regex, hỗ trợ các ký tự có dấu và cũng được hỗ trợ bởi hầu hết mọi trình duyệt.

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

Sử dụng:

console.log (capitalizeIt ('çao 2nd trong chương trình Javascript'));

Đầu ra:

Chương trình Javascript thứ 2 bên trong


1
Cách này tiêu tốn rất nhiều tài nguyên CPU. JavaScript không thay đổi các giá trị nguyên thủy, ngụ ý việc tạo một giá trị mới mỗi khi một thao tác được thực hiện. Sử dụng tốt hơn các chức năng bản địa như "thay thế", exempli gratia.
Daniel Bandeira

0

http://www.mediacolitic.com/iNET/javascript/text/case-capitalize.html là một trong nhiều câu trả lời ngoài kia.

Google có thể là tất cả những gì bạn cần cho những vấn đề như vậy.

Một cách tiếp cận ngây thơ sẽ là phân tách chuỗi theo khoảng trắng, viết hoa chữ cái đầu tiên của mỗi phần tử của mảng kết quả và nối nó lại với nhau. Điều này chỉ để lại chữ viết hoa (ví dụ HTML vẫn là HTML và không trở thành thứ gì đó ngớ ngẩn như Html). Nếu bạn không muốn điều đó ảnh hưởng, hãy biến toàn bộ chuỗi thành chữ thường trước khi tách nó ra.


0

Mã này viết hoa các từ sau dấu chấm:

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

Tôi thích đi với quá trình dễ dàng. Đầu tiên Thay đổi chuỗi thành Mảng để lặp lại dễ dàng, sau đó sử dụng chức năng bản đồ thay đổi từng từ theo ý muốn.

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 hoặc Javascipt không cung cấp phương thức tích hợp để đạt được điều này.

Biến đổi kiểm tra CSS (chuyển đổi văn bản: viết hoa;) không thực sự viết hoa dữ liệu của chuỗi nhưng hiển thị kết xuất được viết hoa trên màn hình.

Nếu bạn đang tìm kiếm một cách hợp pháp hơn để đạt được điều này ở cấp dữ liệu bằng cách sử dụng vanillaJS đơn giản, hãy sử dụng giải pháp này =>

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

Dùng cái này:

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

Bạn có thể sử dụng cách sau để viết hoa các từ trong chuỗi:

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

Ngoài ra còn có locutus: https://locutus.io/php/strings/ucwords/ định nghĩa theo cách này:

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

Tôi sẽ sử dụng regex cho mục đích này:

myString = '  this Is my sTring.  ';
myString.trim().toLowerCase().replace(/\w\S*/g, (w) => (w.replace(/^\w/, (c) => c.toUpperCase())));
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.