代码之家  ›  专栏  ›  技术社区  ›  MDCore Dai Qizhi

在javascript中修剪()的最佳方法是什么

  •  39
  • MDCore Dai Qizhi  · 技术社区  · 16 年前

    这个问题说明了一切;JS似乎没有本机trim()方法。

    19 回复  |  直到 6 年前
        1
  •  16
  •   MDCore Dai Qizhi    10 年前

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

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

        2
  •  41
  •   Darryl Hein IrishChieftain    16 年前

    jquery的最短表单:

    string = $.trim(string);
    

    Link

        3
  •  31
  •   Pat    16 年前

    根据 this page 最好的全面方法是

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

    当然,如果您使用jquery,它将为您提供一个优化的trim方法。

        4
  •  18
  •   John Topley    14 年前

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

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

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

    • 允许您在多行字符串上执行修剪的“g”标志
    • (文本“”)语法,确保函数始终工作,即使传递的参数为空或未定义。
        5
  •  8
  •   Richard Turner    16 年前

    正如其他一些人已经注意到的,通常最好使用第三方JS库来完成这类工作。并不是说trim()是一个复杂的函数来构建你自己,但是有这么多的函数不是Javascript的原生函数,你可能需要这些函数并最终自己编写,使用一个库很快就会变得更划算。

    当然,使用JS库的另一个优点是作者要努力确保这些功能在所有主要浏览器中都能正常工作,这样您就可以编写标准界面的代码,而忽略Internet Explorer和所有其他浏览器之间令人恼火的差异。

        6
  •  7
  •   paxdiablo    16 年前

    稍小的@pat's版本。

    return str.replace( /^\s+|\s+$/g, '' );
    
        7
  •  6
  •   paxdiablo    16 年前

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

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

    对于RTRIM,将锚定在字符串末尾的空格替换为“无”:

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

    修剪:

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

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

        8
  •  5
  •   Benry    16 年前

    为什么不修改字符串原型呢?为什么不从开源库中窃取trim函数,就像我在这里和yui一样?(您真的需要为这个简单的taks加载和整个框架吗?)把它们放在一起,你就能得到:

    String.prototype.trim = function() {
        try {
            return this.replace(/^\s+|\s+$/g, "");
        } catch(e) {
            return this;
        }
    }
    
    var s = " hello ";
    alert(s.trim() == "hello"); // displays true
    
        9
  •  5
  •   Ionuț G. Stan    15 年前

    使用 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 );
    };
    

    不过,我的解决方案是这样的(因为火狐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
  •  4
  •   Timo Kähkönen    11 年前

    我考虑了一个微调功能速度。这个函数与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”,但很容易添加更多的空白字符,例如regexp用作空白(\s)的字符,只会损失一小部分性能(请参见 http://jsperf.com/mega-trim-test/8 )

    edit:previous 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个不同的空白(所有25个空白在 http://perfectionkills.com/whitespace-deviations/ 另外还有UFEFF,即零宽不间断空间。
    • 使剪裁结果在浏览器中保持一致。
    • 如果本机trim()可用并且能够修剪所有27个不同的空白,则使用本机trim()。例外是铬和铬,它们都有很慢的本机trim(),所以我们使用自定义的trim来代替本机的trim。
    • 最重要的是:不美不短,但明显快于24个竞争对手中的任何一个 http://jsperf.com/mega-trim-test/12 (例外:在Windows7中,旧版的火狐3.6.25运行mytrim()的速度相当慢,原因不明)。
        11
  •  3
  •   kiranvj    6 年前

    我将此与本机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());
        12
  •  1
  •   Peter Boughton    16 年前

    这么多javascript问题的答案:jquery

    $j.trim(string)
    



    注意:上面假设您的jquery是通过以下方式设置的:

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

    这比“$”更明智,比每次键入“jquery”更不冗长。

        13
  •  1
  •   Alexander Prokofyev    16 年前

    微软.NET也有 String.trim 作为javascript基本类型扩展的一部分。如果您正在编码ASP.NET应用程序,则可以使用它。

        14
  •  1
  •   jamesmhaley    15 年前

    我用这个。

        String.prototype.trim = function() {
            return this.replace(/^\s+|\s+$/g,"");
        }
    
        15
  •  0
  •   Evan    16 年前

    实际上,对于jquery,这似乎是:

    jQuery.trim(string)
    

    (Reference)

        16
  •  0
  •   Jet    14 年前

    我用这个:

    使用函数。

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

    这可能不是最快的,也可能违反了“.trim()”可能真的应该是什么,但我不喜欢regexs(主要是因为要想知道它们的真正含义/do需要花费太多时间),而且我喜欢有一些我知道可以工作的东西,不管我是否有jquery(更不用说正确的版本,因为我尝试了$.trim(myvar)对于jquery 1.4.2,它不起作用),并且将除去所有额外的空间,而不仅仅是在最后,像应该的那样重建它:

    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;
    }
    
        18
  •  0
  •   CodeChops Mohammad Arshad Alam    10 年前

    这是一个古老的问题,但这些都不适合我。我只需要修剪前后空白,这就是我所做的。我的DIV标记有一个id=开始日期。

    $("#start-date").text().trim()
    
        19
  •  0
  •   Kaushik    10 年前

    你可以用下列方法…

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