在JavaScript中修剪字符串?


1303

如何修剪JavaScript中的字符串?


290
值得一提的是,两年后这个问题被问到String.trim()是在JavaScript 1.8.1 / ECMAScript 5中本地添加的,受以下版本支持:Firefox 3.5 +,Chrome / Safari 5 +,IE9 +(仅在标准模式下!)请参阅scunliffe的答案:stackoverflow.com/a/8522376/8432
wweicker 2012年

46
String.trim()在Node.js中开箱即用也可以正常工作。
布拉德(Brad)2012年

47
要nitpick:,String.trim()类方法在ES5 / Node.js中不存在;而是String.prototype.trim()存在实例方法。用法:' foo '.trim(),不是String.trim(' foo ')
frontendbeauty 2012年

39
OMG,是2013年,兼容模式下的IE9在String上没有trim()方法!
dbrin

80
值得注意的是,在jQuery $.trim(str)中始终可用。
Sygmoral

Answers:


893

自IE9 +起,所有浏览器都具有trim()字符串方法。

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

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, '');
        };
    })();
}

也就是说,如果使用jQuery$.trim(str)也可以使用,并且可以处理undefined / null。


看到这个:

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(/(?:(?:^|\n)\s+|\s+(?:$|\n))/g,'').replace(/\s+/g,' ');};

87
值得注意的是,在jQuery $.trim(str)中始终可用。
Sygmoral

481

如果您已经在使用该框架,则使用jQuery修剪会很方便。

$.trim('  your string   ');

我倾向于经常使用jQuery,因此使用它修剪字符串对我来说很自然。但是可能还有反对jQuery的强烈反对吗?:)


1
这只会修剪空格(换行符)..它不能像php trim一样工作,您也可以在其中修剪字符
Jeffz 2013年

jQuery 3.5.0降低了其trim方法。
赫伯特·彼得斯

165

尽管上面有很多正确答案,但是应该注意,StringJavaScript 中的对象.trim()ECMAScript 5开始具有本机方法。因此,理想情况下,对trim方法进行原型设计的任何尝试均应真正检查其是否已经存在。

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

原生添加: JavaScript 1.8.1 / ECMAScript 5

因此受以下支持:

Firefox:3.5+

Safari: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/


128

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

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

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


29

我知道这个问题已经三年前问过了,现在String.trim()是在JavaScript 中原生添加的。例如,您可以直接进行如下修剪,

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

3
这将无法在ie版本中工作,如果可以的话,请使用jQuery方法$ .trim(str)
Ben Taliadoros

22

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

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

20

公然的Badassery有11种不同的带有基准信息的修饰

http://blog.stevenlevithan.com/archives/faster-trim-javascript

令人惊讶的是,基于正则表达式的速度比传统循环慢。


这是我个人的。该代码很旧!我是为JavaScript1.1和Netscape 3编写的,此后仅进行了少许更新。(原始使用的String.charAt)

/**
 *  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);
}

14

使用本地JavaScript方法:String.trimLeft()String.trimRight(),和String.trim()


String.trim()支持在IE9 +和所有其他的主流浏览器

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


String.trimLeft()并且String.trimRight()是非标准的,但除IE之外的所有主要浏览器均支持

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


使用polyfill可以轻松实现IE支持:

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, '');
        };
    }
}

1
@Brad True,但它们仍然具有广泛的浏览器支持。并且polyfill可以解决任何不一致的情况。
Web_Designer 2013年

1
您应该考虑删除答案。它不会添加尚未被此处其他答案覆盖5倍的任何内容。
布拉德,

4
@Brad我没看到任何人提及trimLefttrimRight
Web_Designer

1
@Brad我更喜欢本机JavaScript实现。该答案由其自身lTrim()rTrim()方法组成。
Web_Designer

1
@Brad它们是非标准的,但某些浏览器仍支持它们,因此在那些浏览器中无需创建polyfill。
Web_Designer

11
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(/(?:(?:^|\n)\s+|\s+(?:$|\n))/g, "").replace(/\s+/g, " ");
};

Matt Duereg无耻地偷走了。



7

angular js项目修剪代码

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


5

使用简单的代码

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

浏览器支持

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

对于旧的浏览器,添加原型

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

最好的解释方式,与他人进行比较replace。我没有完全明白。您想再解释一下regexp部分吗?
muneeb_ahmed '18

4

这是一个非常简单的方法:

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

1
您意识到在2009年问过这个问题吗?:D
GrafiCode 2015年

5
是的,我知道。但是我决定分享我所知道的信息,以防有人需要:)
HenryDev

3
你说对了!学习和分享事物的精神永远是一件好事!
HenryDev

3
“ hello world”->“ helloworld”
查理·伯恩斯

2
这个答案是错误的。trim应该只删除开头和结尾的空格(包括制表符和其他字符)。而是删除所有空格,包括中间的空格。
mbomb007 '18

4

trim()在本地使用String可能是最简单的方法:

const fullName = "       Alireza Dezfoolian     ";
const trimmedFullName = fullName.trim();

console.log(trimmedFullName);


3

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

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

2

如今,几乎所有浏览器都支持String.prototype.trim()

您可以这样使用它:

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

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

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

1

我有一个使用trim的库。因此通过使用以下代码解决了它。

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

1
这不是一个好的解决方案。考虑加载两个jQuery实例的情况(带标签的常见情况)。当jQuery的第二个实例加载时,它将设置其.trim()方法等于String.prototype.trim已经设置为的native return jQuery.trim(this),从而造成堆栈溢出。
布拉德M

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

与之前的答案不同,添加标志 m

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


1

您可以使用普通的JavaScript进行操作:

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

1

现在trim()内置在javascript中。

let yourName = ' something   ';
let actualTrimmedName = yourName.trim();

只是控制台或打印代码,那么您的名字也会被修剪。


在发布不添加任何新信息的答案之前,请确保已阅读有关该问题的评论。前几条评论都描述/讨论了这一问题,并且有大量的赞成票。这些评论来自大约8年前,而这个问题本身已有11年历史了。
Ross Gurbutt

0

不知道什么错误可以隐藏在这里,但是我用这个:

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

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

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

另一种尝试:

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

0

在TypeScript中:

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

如果本地原型不可用,它将退回到正则表达式。


0

当.trim()函数在2008年以JS方式不可用时,我已经编写了此函数进行修整。一些较旧的浏览器仍然不支持.trim()函数,我希望该函数可以对某人有所帮助。

修剪功能

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()接受一个字符串对象,并删除所有开头和结尾的空格(空格,制表符和换行符)并返回修剪后的字符串。您可以使用此功能修剪表单输入,以确保发送有效数据。

例如,可以以下方式调用该函数。

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

-4

我的程序使用单个正则表达式查找需要修整的情况,并使用该正则表达式的结果确定所需的子字符串范围:

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 / \?://(捕获中间项),并且替换片段变为:

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

在这些展示次数中我做了两个性能方面的押注:

  1. 子字符串实现会复制原始字符串的数据吗?如果是这样,首先,当需要修剪字符串时,会进行两次遍历,首先是在正则表达式中(可能希望是局部的),然后是子字符串提取中的第二种遍历。希望子字符串实现仅引用原始字符串,因此子字符串之类的操作几乎是免费的。交叉手指

  2. 正则表达式中的捕获效果有多好?中间值,即输出值,可能会很长。我还没有准备好所有正则表达式的捕获都不会阻止数百KB的输入捕获,但是我也没有进行测试(运行时太多,对不起!)。第二个总是进行捕获;如果您的引擎可以做到这一点而不会受到打击,那么也许可以使用上述一些字符串编排技术来确保使用它!


-7

对于IE9 +和其他浏览器

function trim(text) {
    return (text == null) ? '' : ''.trim.call(text);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.