如何使用Jquery在连字符后仍然将每个单词首字母大写?

7
我希望在输入时(使用keyup函数)将所有单词大写,以格式化输入的姓名。
例如:
john doe => John Doe JOHN DOE => John Doe tommy-lee => 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。

如何获得我想要的最佳解决方案?

谢谢


1
这实际上不是一个 jQuery 的问题,最好使用纯 JS 来解决。请参见下面的答案。 - Lapple
str.split(/(\s|-)+/).map(function( v ,i ){ return v.charAt(0).toUpperCase()+ v.slice(1).toLowerCase(); }).join('') - rab
3个回答

9
问题出在单词边界上,如果您手动设置边界,则可以正常工作。
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


4
请使用这个:
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'));

0

在keyup事件后,您可以像这样做:拆分字符串,获取第一个字符并将其大写,然后重新连接所有字符。您可以查看我为您编写的演示链接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(' ');  
}

1
根据发帖者的问题,这将不会使连字符后面的字符大写。 - njr101
感谢您的回复。对于特殊字符,它可以正常工作,但是对于连字符后面的字母不再起作用(参见:http://jsfiddle.net/vbx3x/5/)。 - user1010687
我更新了分割部分,我没有看到其他字符“-|”等。现在没问题了,你可以测试一下。 - erimerturk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接