JavaScript中的trim字符串

Trim string in JavaScript?

如何在javascript中修剪字符串?


自IE9+以来的所有浏览器都有trim()

对于不支持trim()的浏览器,可以使用MDN中的polyfill:

1
2
3
4
5
6
7
8
9
if (!String.prototype.trim) {
    (function() {
        // Make sure we trim BOM and NBSP
        var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
        String.prototype.trim = function() {
            return this.replace(rtrim, '');
        };
    })();
}

看到这个:

1
2
3
4
5
6
7
8
9
String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g, '');};

String.prototype.ltrim=function(){return this.replace(/^\s+/,'');};

String.prototype.rtrim=function(){return this.replace(/\s+$/,'');};

String.prototype.fulltrim=function(){return this.replace(/(?:(?:^|
)\s+|\s+(?:$|
))/g,'').replace(/\s+/g,' ');};


如果已经在使用jquery框架,那么jquery中的trim很方便。

1
$.trim('  your string   ');

我经常使用jquery,所以用它来修剪字符串对我来说是很自然的。但有没有可能存在针对jquery的强烈反对?:)


虽然上面有很多正确的答案,但应该注意的是,从ecmascript 5开始,javascript中的String对象就有一个本地的.trim()方法。因此,理想情况下,任何对修剪方法进行原型化的尝试都应该首先检查它是否已经存在。

1
2
3
4
5
if(!String.prototype.trim){  
  String.prototype.trim = function(){  
    return this.replace(/^\s+|\s+$/g,'');  
  };  
}

本机添加到:javascript 1.8.1/ecmascript 5

因此支持于:

火狐:3.5 +

狩猎:5 +

Internet Explorer:IE9+(仅限标准模式!)http://blogs.msdn.com/b/ie/archive/2010/06/25/enhanced-scripting-in-ie9-ecmascript-5-support-and-more.aspx

铬:5 +

歌剧:10.5 +

ecmascript 5支持表:http://kangax.github.com/es5-compat-table/


有很多实现可以使用。最明显的似乎是这样的:

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

" foo bar".trim();  //"foo bar"


这里的简单版本javascript修剪的一般功能是什么?

1
2
3
function trim(str) {
        return str.replace(/^\s+|\s+$/g,"");
}

我知道这个问题三年前就被问到了,现在,String.trim()是在javascript中本地添加的,例如,可以直接修剪如下:

1
document.getElementById("id").value.trim();


如果使用jquery,请使用jQuery.trim()函数。例如:

1
if( jQuery.trim(StringVariable) == '')

明目张胆的不良资产有11种不同的修剪,带有基准信息:

Faster JavaScript Trim

毫不奇怪,基于regexp的循环比传统循环慢。

这是我个人的。这个密码是旧的!我是为javascript1.1和netscape 3写的,从那以后它只稍微更新了一点。(原始使用的字符串.charat)

1
2
3
4
5
6
7
8
9
10
11
12
/**
 *  Trim string. Actually trims all control characters.
 *  Ignores fancy Unicode spaces. Forces to string.
 */

function trim(str) {
    str = str.toString();
    var begin = 0;
    var end = str.length - 1;
    while (begin <= end && str.charCodeAt(begin) < 33) { ++begin; }
    while (end > begin && str.charCodeAt(end) < 33) { --end; }
    return str.substr(begin, end - begin + 1);
}


使用本地的javascript方法:String.trimLeft()String.trimRight()String.trim()

IE9+和所有其他主要浏览器都支持String.trim()

1
'  Hello  '.trim()  //-> 'Hello'

String.trimLeft()String.trimRight()是非标准的,但在除IE以外的所有主要浏览器中都支持。

1
2
'  Hello  '.trimLeft()   //-> 'Hello  '
'  Hello  '.trimRight()  //-> '  Hello'

但是,使用PolyFill很容易实现IE支持:

1
2
3
4
5
6
7
8
9
10
11
12
13
if (!''.trimLeft) {
    String.prototype.trimLeft = function() {
        return this.replace(/^\s+/,'');
    };
    String.prototype.trimRight = function() {
        return this.replace(/\s+$/,'');
    };
    if (!''.trim) {
        String.prototype.trim = function() {
            return this.replace(/^\s+|\s+$/g, '');
        };
    }
}


现在,您可以使用string.trim()这是本机JavaScript实现

1
2
var orig ="   foo ";
console.log(orig.trim());//foo

也见

  • TrimeLeTo()
  • TrimRead()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
String.prototype.trim = String.prototype.trim || function () {
    return this.replace(/^\s+|\s+$/g,"");
};

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

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

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

不知羞耻地从马特·杜雷格那里偷走了。


Angular JS项目的修剪代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var trim = (function() {

  // if a reference is a `String`.
  function isString(value){
       return typeof value == 'string';
  }

  // native trim is way faster: http://jsperf.com/angular-trim-test
  // but IE doesn't have it... :-(
  // TODO: we should move this into IE/ES5 polyfill

  if (!String.prototype.trim) {
    return function(value) {
      return isString(value) ?
         value.replace(/^\s*/, '').replace(/\s*$/, '') : value;
    };
  }

  return function(value) {
    return isString(value) ? value.trim() : value;
  };

})();

称之为trim(" hello")


简单使用代码

1
2
var str ="       Hello World!       ";
alert(str.trim());

浏览器支持

1
2
Feature         Chrome  Firefox Internet Explorer   Opera   Safari  Edge
Basic support   (Yes)   3.5     9                   10.5    5       ?

对于旧浏览器,添加原型

1
2
3
4
5
if (!String.prototype.trim) {
  String.prototype.trim = function () {
    return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
  };
}


下面是一个非常简单的方法:

1
2
3
function removeSpaces(string){
return string.split(' ').join('');
}


您可以将变量声明为字符串并使用其trim函数:

1
2
var str = new String('my string');
str= str.trim();

现在,几乎每个浏览器都支持String.prototype.trim()

您可以这样使用它:

1
2
var origStr = '   foo  ';
var newStr = origStr.trim(); // Value of newStr becomes 'foo'

如果您仍然需要支持不支持此功能的古老浏览器,这是MDN建议的polyfill:

1
2
3
4
5
if (!String.prototype.trim) {
    String.prototype.trim = function () {
       return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
    };
}

我有一个使用trim的lib。所以用下面的代码解决了这个问题。

1
String.prototype.trim = String.prototype.trim || function(){ return jQuery.trim(this); };


1
2
3
4
5
if(!String.prototype.trim){  
  String.prototype.trim = function(){  
    return this.replace(/^\s+|\s+$/gm,'');  
  };  
}

与前面的答案不同,它添加了标志m

标志m将搜索多个线性的文本。在此模式中,在换行符(
之前和之后插入模式的开始和结束标记(^$)。


在本机字符串上使用trim()可能是最简单的方法:

1
2
3
4
const fullName ="       Alireza Dezfoolian    ";
const trimmedFullName = fullName.trim();

console.log(trimmedFullName);


在这里,它是在打字脚本:

1
2
3
4
5
6
7
var trim: (input: string) => string = String.prototype.trim
    ? ((input: string) : string => {
        return (input ||"").trim();
    })
    : ((input: string) : string => {
        return (input ||"").replace(/^\s+|\s+$/g,"");
    })

如果本机原型不可用,它将返回到regex。


当.trim()函数在2008年的JS中不可用时,我为trim编写了这个函数。一些旧的浏览器仍然不支持.trim()函数,我希望这个函数可以帮助某些人。

修剪功能

1
2
3
4
5
6
7
8
9
10
11
12
13
function trim(str)
{
    var startpatt = /^\s/;
    var endpatt = /\s$/;

    while(str.search(startpatt) == 0)
        str = str.substring(1, str.length);

    while(str.search(endpatt) == str.length-1)
        str = str.substring(0, str.length-1);  

    return str;
}

说明:函数trim()接受一个字符串对象,并删除所有开始和结尾的空白(空格、制表符和换行符),然后返回修剪后的字符串。您可以使用此函数修剪表单输入以确保发送有效数据。

作为示例,可以以下方式调用函数。

1
form.elements[i].value = trim(form.elements[i].value);

不知道什么bug可以隐藏在这里,但我使用这个:

1
2
var some_string_with_extra_spaces="   goes here   "
console.log(some_string_with_extra_spaces.match(/\S.*\S|\S/)[0])

或者,如果文本包含输入:

1
console.log(some_string_with_extra_spaces.match(/\S[\s\S]*\S|\S/)[0])

另一种尝试:

1
console.log(some_string_with_extra_spaces.match(/^\s*(.*?)\s*$/)[1])

您可以使用普通的javascript:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function trimString(str, maxLen) {
if (str.length <= maxLen) {
return str;
}
var trimmed = str.substr(0, maxLen);
return trimmed.substr(0, trimmed.lastIndexOf(' ')) + '…';
}

// Let's test it

sentenceOne ="too short";
sentencetwo ="more than the max length";

console.log(trimString(sentenceOne, 15));
console.log(trimString(sentencetwo, 15));

Mine使用单个regex查找需要修剪的情况,并使用该regex的结果确定所需的子字符串边界:

1
2
3
4
5
6
7
8
var illmatch= /^(\s*)(?:.*?)(\s*)$/
function strip(me){
    var match= illmatch.exec(me)
    if(match && (match[1].length || match[2].length)){
        me= me.substring(match[1].length, p.length-match[2].length)
    }
    return me
}

其中一个设计决策是使用子字符串来执行最终捕获。S/O?://(进行中期捕获),替换片段变为:

1
2
3
    if(match && (match[1].length || match[3].length)){
        me= match[2]
    }

我在这些IMPLS中做了两个性能赌注:

  • 子字符串实现是否复制原始字符串的数据?如果是这样的话,在第一个,当一个字符串需要修剪时,有一个双遍历,第一个在regex中(希望是部分的),第二个在子字符串提取中。希望子字符串实现只引用原始字符串,这样子字符串之类的操作几乎是免费的。交叉手指

  • 在regex impl中捕获有多好?中期,即产值,可能非常长。我还没有准备好存储所有regex impl的捕获不会在几百kb的输入捕获中受阻,但我也没有测试(运行时太多,抱歉!)。第二个始终运行捕获;如果您的引擎可以在不受命中的情况下执行此操作,那么可以使用上面的一些字符串套索技术,确保使用它!


  • 对于IE9+和其他浏览器

    1
    2
    3
    function trim(text) {
        return (text == null) ? '' : ''.trim.call(text);
    }