Как использовать каждое слово с заглавной буквы даже после дефиса с помощью Jquery?

Я хочу использовать все слова при вводе (используя функцию keyup) для форматирования введенных имен.

Примеры :

Джон Доу => Джон Доу

ДЖОН ДОУ => Джон Доу

tommy-lee => Томми-ли

В настоящее время я использую этот код:

$("input").keyup(function() {
    var cp_value= ucwords($(this).val(),true) ;
    $(this).val(cp_value );
});

function ucwords(str,force){
    str=force ? str.toLowerCase() : str;  
    return str.replace(/(\b)([a-zA-Z])/g,
    function(firstLetter){
        return firstLetter.toUpperCase();
    });
}

Но если слово содержит знак с ударением, следующая буква также пишется прописной: John Döe => John DöE.

Какое лучшее решение, чтобы получить то, что я хочу?

Спасибо


person user1010687    schedule 24.10.2011    source источник
comment
На самом деле это не проблема jQuery, поскольку ее лучше решать с помощью простого JS. Смотрите мой ответ ниже.   -  person Lapple    schedule 24.10.2011


Ответы (3)


Проблема с границей слова, если вы делаете ручную границу, она работает

function ucwords(str,force){
    str=force ? str.toLowerCase() : str;
    return str.replace(/(^([a-zA-Z\p{M}]))|([ -][a-zA-Z\p{M}])/g,
    function(firstLetter){
    return firstLetter.toUpperCase();
    });
}

и добавление Unicode для акцентированных символов, а также

person kamui    schedule 24.10.2011

Используйте этот:

function ucwords(input) {
    var words = input.split(/(\s|-)+/),
        output = [];

    for (var i = 0, len = words.length; i < len; i += 1) {
        output.push(words[i][0].toUpperCase() +
                    words[i].toLowerCase().substr(1));
    }

    return output.join('');
}

Тестирование:

console.log(ucwords('JOHN   DOE'),
            ucwords('tommy-lee'),
            ucwords('TOMMY-lee'),
            ucwords('John Döe'));
person Lapple    schedule 24.10.2011

вы можете сделать что-то подобное после разделения клавиш, затем получить первый символ и заглавные буквы, а затем присоединиться ко всем. вы можете проверить эту ссылку, я написал для вас демонстрацию http://jsfiddle.net/vbx3x/5/

function ucwords(str,force){
 str=force ? str.toLowerCase() : str;  

 var temp= str.split(/(\s|-)+/);
for(var i=0; i<temp.length; i++) {
  temp[i] = temp[i].substr(0,1).toUpperCase() + temp[i].substr(1,temp[i].length-1)
}
 return temp.join(' ');  
}
person erimerturk    schedule 24.10.2011
comment
Согласно вопросу ОП, это не будет использовать заглавную букву после дефиса. - person njr101; 24.10.2011
comment
Спасибо за ваш ответ. Он отлично работает для специальных символов, но не для букв после дефиса (см.: jsfiddle.net/vbx3x/ 5) - person user1010687; 24.10.2011
comment
я обновил раздельную часть, я не видел других символов, -| и т. д. теперь все в порядке, вы можете проверить это. - person erimerturk; 24.10.2011