用JS或JQuery将所有大写字母转换成大写字母的最有效方法?

时间:2019-04-19 04:06:56

标签: javascript jquery regex

我最初有一个全大写的字符串,我希望它是标题大小写:

  

这是我的STRING,为什么我在喊?

我希望它是

  

这是我的弦乐,为什么我会大喊?

当字母最初位于CAPS中时,我不能使用CSS text-transform:capitalize。所以我知道我必须使用JS。我尝试了此方法,该方法有效,但我不确定它是否非常有效:

 $('.location').each(function () {

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

});

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

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

谢谢!

5 个答案:

答案 0 :(得分:4)

您可以匹配连续的单词字符,并使用替换功能替换第一个字符(按原样),然后使用其余的toLowerCase()替换它们:

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

答案 1 :(得分:2)

另一种可能的解决方案是在String.replace()中使用正则表达式/./g并检查replacement function是否当前匹配的前一个字符是letter并且此字符的offset不是zero,以决定用lower-case还是upper-case版本替换字符。

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);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}

答案 2 :(得分:1)

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

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)

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)

答案 3 :(得分:1)

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中的组。捕获时,您可以按照here on MDN中的说明访问组。

我不知道这是否是效率最高的,但这很简单(即,将来的开发人员很容易迷惑)。

答案 4 :(得分:0)

我使用此等同于PHP的功能:

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()));
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

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

如您所见,这不会将大写字母更改为小写字母。如果您想对所有单词强制使用标题大小写,请使用以下方法:

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()));
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

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