关于javascript:使用JS或JQuery将所有大写字母翻译成标题的最有效方法?

Most efficient way to turn all caps into title case with JS or JQuery?

本问题已经有最佳答案,请猛点这里访问。

我有一个字符串原来是所有大写的,我希望它是标题:

THIS IS MY STRING WHY AM I YELLLING?

我希望它是:

This Is My String Why Am I Yelling?

我不能使用CSS文本转换:当字母最初是大写时大写。所以我知道我必须使用JS。我试过这个方法,但我不确定它是否有效:

1
2
3
4
5
6
7
 $('.location').each(function () {

    var upper = $(this).html();
    var lower = upper.toLowerCase();
    $(this).replaceWith(lower);

});

现在我的字母实际上是小写的,我使用css text-transform:capitalize

有更有效的方法吗?(我已经在这个网站上使用了jquery,所以这就是我上面使用它的原因。)

谢谢!


您可以匹配连续的单词字符,并使用replacer函数替换为第一个字符(按原样),然后使用对其调用的toLowerCase()替换其余字符:

1
2
3
4
5
6
const text = 'THIS IS MY STRING WHY AM I YELLLING?';
const output = text.replace(
  /(\w)(\w*)/g,
  (_, firstChar, rest) => firstChar + rest.toLowerCase()
);
console.log(output);


另一种可能的解决方案是在string.replace()中使用正则表达式/./g并检查替换函数,如果当前匹配的字符的前一个字符是letter并且此字符的offset不是zero来决定是否用lower-caseupper-case替换该字符。RSiC.

1
2
3
4
5
6
7
8
let str ="THIS IS MY STRING WHY AM I YELLLING. WASHINGTON D.C?";

let out = str.replace(/./g, (m, offset, str) =>
{
    return (offset !== 0 && /\w/.test(str[offset-1])) ? m.toLowerCase() : m.toUpperCase();
});

console.log(out);
1
2
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}


1
2
3
4
5
const s = 'THIS IS MY STRING, from WaShInGtOn D.C. WHY AM I YELLLING?'
const result = s.replace(/([a-z])([a-z]*)/gi, (_, p1, p2) =>
  p1.toUpperCase() + p2.toLowerCase()
)
console.log(result)

String.replace中使用简单的regex和捕获组。捕获时,可以访问MDN上描述的组。

我不知道这是否是最有效的,但它相当简单(也就是说,未来的开发者很容易摸索)。


这是一个按空间拆分并处理每个数组项的解决方案。

1
2
3
4
5
var str = 'THIS IS MY STRING WHY AM I YELLLING?';
var arr = str.split(' ');
var result = arr.map(c=> c.charAt(0) + c.toLowerCase().slice(1));
str = result.join(' ')
console.log(str)

1
2
3
4
5
var str = 'THIS IS MY STRING WHY AM I YELLLING?';
var arr = str.split(' ');
var result = arr.map(c=> c.charAt(0) + c.toLowerCase().slice(1));
str = result.join(' ')
console.log(str)


我使用这个php等价函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function ucwords(str) {
  var words = str.split(' ');
  str = '';
  for (var i = 0; i < words.length; i++) {
    var word = words[i];
    word = word.charAt(0).toUpperCase() + word.slice(1);
    if (i > 0) {
      str = str + ' ';
    }
    str = str + word;
  }
  return str;
}

$(document).ready(function() {
  $('p').each(function() {
    $(this).text(ucwords($(this).text()));
  });
});

1
2
3
4
5
6
7
8
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js">

<p>
this is all lowercase text
</p>
<p>
THIS IS ALL UPPERCASE TEXT
</p>

如您所见,这不会将大写字母更改为小写字母。如果你想在所有单词上强制使用标题框,我使用:

1
2
3
4
5
6
7
8
9
10
11
function toTitleCase(str) {
  return str.replace(/\w\S*/g, function(txt) {
    return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
  });
}

$(document).ready(function() {
  $('p').each(function() {
    $(this).text(toTitleCase($(this).text()));
  });
});

1
2
3
4
5
6
7
8
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js">

<p>
this is all lowercase text
</p>
<p>
THIS IS ALL UPPERCASE TEXT
</p>