【问题标题】:How to trim() white spaces from a string?如何从字符串中修剪()空格?
【发布时间】:2010-09-16 20:25:25
【问题描述】:

JavaScript 似乎没有原生的trim() 方法。如何使用 JavaScript 修剪字符串开头和结尾的空格?

【问题讨论】:

    标签: javascript jquery string trim


    【解决方案1】:

    我将它与原生 JavaScript 一起使用

    // Adding trim function to String object if its not there
    if(typeof String.prototype.trim !== 'function') {
      String.prototype.trim = function() {
        return this.replace(/^\s+|\s+$/g, '');
      }
    }
    

    这样使用

    var myString = "                  some text                  ";
    
    alert(myString.trim());
    

    示例

    // Adding trim function to String object if its not there
    if(typeof String.prototype.trim !== 'function') {
      String.prototype.trim = function() {
        return this.replace(/^\s+|\s+$/g, '');
      }
    }
    
    var str = "      some text              ";
    console.log(str.trim());

    【讨论】:

      【解决方案2】:

      您可以使用以下...

      function trim(str) {
          try {
              if (str && typeof(str) == 'string') {
                  return str.replace(/^\s*|\s*$/g, "");
              } else {
                  return '';
              }
          } catch (e) {
              return str;
          }
      }
      

      【讨论】:

        【解决方案3】:

        这是一个老问题,但这些都不适合我。我只需要修剪前导和尾随空格,这就是我所做的。我的 div 标签有一个 id = start-date。

        $("#start-date").text().trim()
        

        【讨论】:

        【解决方案4】:

        我知道这个问题很古老,但现在,Javascript 实际上确实有一个原生的 .trim()

        https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/Trim

        【讨论】:

        • 你是对的!原生总是更好。它只是从 IE9 及更高版本开始,但在几年内也没有多大关系。
        • @MDCore 感谢您接受我的回答并提及最低 IE 版本。但是当你说几年后它不会有关系时,你指的是什么,你是说 javascript 会过时吗?
        • @KR 所以五年半前我问了这个问题。从那时起,trim() 已成为标准函数。我认为只是指出我们在 IE 支持方面几乎在那里,但再过五年半就没有实际意义了。如果他们坚持使用 IE8,我宁愿人们使用本机功能并使用许多其他答案之一。
        【解决方案5】:

        这可能不是最快的,并且可能违反“.trim()”可能真正应该是的,但我不喜欢正则表达式(主要是因为要花很多时间来弄清楚它们的真正含义/做什么)而且我喜欢有一些我知道不管我是否有 jQuery 都可以工作的东西(更不用说正确的版本,因为我用 jQuery 1.4.2 尝试了 $.trim(myVar) 并且它不起作用),并且会得到摆脱所有额外的空间,而不仅仅是在最后,像它应该的那样重建它:

        function Trim(obj) {
            var coll = "";
            var arrObj = obj.split(' ');
        
            for (var i=0;i<arrObj.length;i++) {
                if (arrObj[i] == "") {
                    arrObj.splice(i,1);  // removes array indices containing spaces
                }
            }
            //alert(arrObj.length);  // should be equal to the number of words
            // Rebuilds with spaces in-between words, but without spaces at the end
            for (var i=0;i<arrObj.length;i++) {
                if (arrObj[i] != "" && i != arrObj.length-1)
                    coll += arrObj[i] + " ";
                if (arrObj[i] != "" && i == arrObj.length-1)
                    coll += arrObj[i];
            }
        
            return coll;
        }
        

        【讨论】:

          【解决方案6】:

          我考虑了一个修剪功能速度。这个函数明显击败了所有 24 个竞争对手(其中许多使用正则表达式)以及 Chrome 和 Chromium(!) 的原生 string.trim(),并且执行速度与 Safari 的 trim() 一样快。测试结果在这里:http://jsperf.com/mega-trim-test/7

          function trim27(str) {
            var c;
            for (var i = 0; i < str.length; i++) {
              c = str.charCodeAt(i);
              if (c == 32 || c == 10 || c == 13 || c == 9 || c == 12)
              continue; else break;
            }
            for (var j = str.length - 1; j >= i; j--) {
              c = str.charCodeAt(j);
              if (c == 32 || c == 10 || c == 13 || c == 9 || c == 12)
              continue; else break;
            }
            return str.substring(i, j + 1);
          }
          

          该函数修剪字符“\n\r\t\f”,但添加更多空白字符很容易,例如。那些正则表达式用作空格 (\s) 的那些只有轻微的性能损失(请参阅http://jsperf.com/mega-trim-test/8)。

          编辑:之前的 trim27() 只修剪最常见的字符(“\n\r\t\f”),但为了修剪所有可能的空格,我在下面添加了一个新函数 mytrim():

          if (!String.prototype.trim || "\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF".trim() || navigator.userAgent.toString().toLowerCase().indexOf("chrome") != -1)
              var mytrim = function(str) {
                  var c;
                  for (var i = 0; i < str.length; i++) {
                      c = str.charCodeAt(i);
                      if (c == 32 || c == 10 || c == 13 || c == 9 || c == 12 || c == 11 || c == 160 || c == 5760 || c == 6158 || c == 8192 || c == 8193 || c == 8194 || c == 8195 || c == 8196 || c == 8197 || c == 8198 || c == 8199 || c == 8200 || c == 8201 || c == 8202 || c == 8232 || c == 8233 || c == 8239 || c == 8287 || c == 12288 || c == 65279)
                      continue; else break;
                  }
                  for (var j = str.length - 1; j >= i; j--) {
                      c = str.charCodeAt(j);
                      if (c == 32 || c == 10 || c == 13 || c == 9 || c == 12 || c == 11 || c == 160 || c == 5760 || c == 6158 || c == 8192 || c == 8193 || c == 8194 || c == 8195 || c == 8196 || c == 8197 || c == 8198 || c == 8199 || c == 8200 || c == 8201 || c == 8202 || c == 8232 || c == 8233 || c == 8239 || c == 8287 || c == 12288 || c == 65279)
                      continue; else break;
                  }
                  return str.substring(i, j + 1);
              };
              else var mytrim = function(str) {
                  return str.trim();
              }
          

          这样使用:

          var foo = mytrim(" \n \t Trimmed \f \n "); // foo is now "Trimmed"
          

          上面的 mytrim() 做了以下事情:

          • 修剪 26 个不同的空格(http://perfectionkills.com/whitespace-deviations/ 中提到的所有 25 个空格,另外还有 uFEFF,即零宽度无间隔空格。
          • 使修剪结果在浏览器中保持一致。
          • 使用原生 trim()(如果可用)并且能够修剪所有 27 个不同的空格。例外是 Chrome 和 Chromium,它们的原生 trim() 都很慢,以至于我们使用自定义的 trim() 而不是原生的。
          • 最重要的是:不漂亮也不短,但明显比http://jsperf.com/mega-trim-test/12 中的 24 个竞争替代品中的任何一个都快(例外:Windows 7 中相当旧的 Firefox 3.6.25 运行 mytrim() 相当慢原因不明)。

          【讨论】:

            【解决方案7】:

            嗯,正如很多人常说的,trim 函数工作得很好,但如果您不想使用整个框架来执行trim,那么看看它的实现可能会很有用。所以这里是:

            function( text ) { return (text || "").replace( /^(\s|\u00A0)+|(\s|\u00A0)+$/g, "" );}
            

            与这里已经提出的其他解决方案相比,我在此实施中看到的主要优势是:

            • 允许您对多行字符串执行修剪的“g”标志
            • (text || "") 语法确保函数始终有效,即使传递的参数为 null 或未定义。

            【讨论】:

            • 如果没有 m 标志,g 标志在这里没有用处。
            【解决方案8】:

            我用这个:

            使用函数。

             function trim($) { 
                            return (typeof $ == "function" ? $() : $).replace(/[\s]*/g,"")
                    }
            
                    code example: 
            
                    trim((function(){ return "a  b"})) // ab
            
                    trim(" a  b") //ab
            

            【讨论】:

              【解决方案9】:

              使用Ariel Flesler's fast trim function:

              // Licensed under BSD
              function myBestTrim( str ){
               var start = -1,
                end = str.length;
               while( str.charCodeAt(--end) < 33 );
               while( str.charCodeAt(++start) < 33 );
               return str.slice( start, end + 1 );
              };
              

              不过,我的解决方案是这样的(因为 Firefox 3.5 及更高版本中的 String 对象已经有一个 trim method):

              String.prototype.trim = String.prototype.trim || function () {
                  var start = -1,
                      end   = this.length;
              
                  while( this.charCodeAt(--end) < 33 );
                  while( this.charCodeAt(++start) < 33 );
              
                  return this.slice( start, end + 1 );
              };
              

              【讨论】:

              • 你在开玩笑吗?它不能很快,因为它使用了大量的内部函数
              【解决方案10】:

              我用这个。

                  String.prototype.trim = function() {
                      return this.replace(/^\s+|\s+$/g,"");
                  }
              

              【讨论】:

                【解决方案11】:

                为什么不直接修改 String 原型呢?为什么不从开源库中窃取修剪功能,就像我在 YUI 中所做的那样? (你真的需要为这个简单的任务加载整个框架吗?)把它们放在一起,你就得到了:

                String.prototype.trim = function() {
                    try {
                        return this.replace(/^\s+|\s+$/g, "");
                    } catch(e) {
                        return this;
                    }
                }
                
                var s = " hello ";
                alert(s.trim() == "hello"); // displays true
                

                【讨论】:

                  【解决方案12】:

                  Microsoft .NET 还具有 String.trim 函数作为 JavaScript 基本类型扩展的一部分。如果您正在编写 ASP.NET 应用程序,则可以使用它。

                  【讨论】:

                    【解决方案13】:

                    对于 ltrim,将锚定在字符串开头的空格替换为空:

                    str2 = str.replace(/^\s+/,'');
                    

                    对于 rtrim,将锚定在字符串末尾的空格替换为空:

                    str2 = str.replace(/\s+$/,'');
                    

                    修剪:

                    str2 = str.replace(/^\s+|\s+$/g,'');
                    

                    这些都使用正则表达式来完成实际工作。

                    【讨论】:

                      【解决方案14】:

                      这么多 JavaScript 问题的答案:jQuery

                      $j.trim(string)
                      



                      注意:以上假设您的 jQuery 已设置:

                      <script type="text/javascript">$j = jQuery.noConflict();</script>
                      

                      这比“$”更明智,也比每次都输入“jQuery”更简洁。

                      【讨论】:

                      • jQuery 对象。比仅使用 $ 更明智。
                      • 为什么$j$ 更明智?
                      【解决方案15】:

                      jQuery 的最短形式:

                      string = $.trim(string);
                      

                      Link

                      【讨论】:

                        【解决方案16】:

                        实际上,使用 jQuery 似乎是这样:

                        jQuery.trim(string)
                        

                        (Reference)

                        【讨论】:

                          【解决方案17】:

                          @Pat's 的稍微小一点的版本。

                          return str.replace( /^\s+|\s+$/g, '' );
                          

                          【讨论】:

                          • 我认为您需要在方法调用中的文本上执行该操作。 ;)
                          【解决方案18】:

                          正如其他一些人已经指出的那样,通常最好使用第三方 JS 库来做这种事情。并不是说 trim() 是一个自己构建的复杂函数,但是有很多函数不是 JavaScript 原生的,你可能需要并最终自己编写,使用库很快就会变得更具成本效益。

                          当然,使用 JS 库的另一个优点是作者努力确保这些函数在所有主流浏览器上都能正常工作,这样您就可以对标准接口进行编码,而忘记 Internet 之间令人讨厌的差异Explorer 和所有其他浏览器。

                          【讨论】:

                            【解决方案19】:

                            根据this page,最好的全能方法是

                            return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
                            

                            当然如果你使用的是 jQuery ,它会为你提供优化的修剪方法。

                            【讨论】:

                            • 根据链接页面,\s+ 和 \s\s* 之间的唯一区别是后者快一点。
                            • 如果您进一步阅读,文章末尾提到的修改后的 trim11 是更长字符串的更好方法。
                            • 这是一个旧线程,同时原生修剪是用 Javascript 实现的。 Pat 的正则表达式和 Chris MacDonald 提到的 trim11 非常慢,并且 jquery 的修剪在某些浏览器中也很慢(jsperf.com/mega-trim-test/16)。更快的修剪实现在这里:stackoverflow.com/a/12547889/1691517.
                            猜你喜欢
                            • 2010-10-20
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2021-05-20
                            • 1970-01-01
                            • 2016-01-21
                            相关资源
                            最近更新 更多