ChatGPT解决这个技术问题 Extra ChatGPT

在 JavaScript 中修剪字符串

如何从字符串的开头和结尾删除所有空格?

值得一提的是,在这个问题被问到两年后,String.trim() 是在 JavaScript 1.8.1 / ECMAScript 5 中原生添加的,支持:Firefox 3.5+、Chrome/Safari 5+、IE9+(仅在标准模式下!)见斯昆利夫的回答:stackoverflow.com/a/8522376/8432
String.trim() 在 Node.js 中也可以开箱即用。
吹毛求疵:String.trim(),类方法,在 ES5/Node.js 中不存在;相反,实例方法 String.prototype.trim() 存在。用法:' foo '.trim(),而不是 String.trim(' foo ')
天哪,现在是 2013 年,兼容模式下的 IE9 在 String 上没有 trim() 方法!
值得注意的是,在 jQuery 中,$.trim(str) 始终可用。

F
Flimm

自 IE9+ 以来的所有浏览器都有 trim() 字符串方法:

" \n test \n ".trim(); // returns "test" here

对于那些不支持 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,' ');};

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

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

$.trim('  your string   ');

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


这只会修剪空白(换行符).. 它不像 php trim 那样工作,您也可以修剪字符
jQuery 3.5.0 贬低了他们的 trim 方法。
s
scunliffe

虽然上面有很多正确答案,但应该注意的是,JavaScript 中的 String 对象在 ECMAScript 5 中具有原生 .trim() 方法。因此,理想情况下,任何对 trim 方法进行原型设计的尝试都应该首先检查它是否已经存在。

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/


G
Gumbo

a lot of implementations 可以使用。最明显的似乎是这样的:

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

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

M
Mark Davidson

此处为简单版What is a general function for JavaScript trim?

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

V
Vijin Paulraj

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

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

这在 ie 版本中不起作用,如果可以,请使用 jQuery 方法 $.trim(str)
P
Pang

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

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

T
Tero

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

W
Web_Designer

使用本机 JavaScript 方法:String.trimLeft()String.trimRight()String.trim()


IE9+ and all other major browsers 支持 String.trim()

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


String.trimLeft()String.trimRight() 是非标准的,但在 all major browsers except IE 中受支持

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

IE 支持很容易使用 polyfill,但是:

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

@Brad True,但它们仍然具有广泛的浏览器支持。并且 polyfill 负责处理任何不一致。
您应该考虑删除您的答案。它不会添加任何尚未被其他答案覆盖 5 倍的内容。
@Brad 我没有看到有人提到 trimLefttrimRight
@Brad 我更喜欢本地 JavaScript 实现(如果可用)。该答案构成了它自己的 lTrim()rTrim() 方法。
@Brad 它们是非标准的,但某些浏览器仍然支持它们,因此在这些浏览器中无需创建 polyfill。
Q
Quentin
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 窃取。


r
rab

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


B
Behnam Mohammadi

使用简单的代码

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 函数正则表达式。我没有完全明白。你想多解释一下正则表达式部分吗?
H
HenryDev

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

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

“你好世界”->“你好世界”
这个答案是错误的。 trim 应仅删除前导和尾随 空格(包括制表符和其他字符)。这会删除所有空格,包括中间的空格。
这个无法解释的答案是不正确的,应该删除。换句话说,它是对不同问题的正确答案。
y
yckart

我有一个使用修剪的库。所以通过使用以下代码解决了它。

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

这不是一个好的解决方案。考虑加载两个 jQuery 实例的情况(带有标签的常见场景)。当第二个 jQuery 实例加载时,它会将它的 .trim() 方法设置为等于已经设置为 return jQuery.trim(this) 的本机 String.prototype.trim,从而创建堆栈溢出。
A
AnaMaria

早在 2008 年,当 .trim() 函数在 JS 中不可用时,我已经为 trim 编写了这个函数。一些较旧的浏览器仍然不支持 .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);

M
Makyen

你可以使用普通的 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));

p
plavozont

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

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

如果文本可能包含换行符,则此技术很危险。它将截断字符串。有比这更好/更可靠的技术。 "one two\r\nthree".match(/\S.*\S|\S/)[0] 产生:"one two"
J
Joseph Lennox

这是在 TypeScript 中:

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

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


r
rektide

我的使用单个正则表达式来查找需要修剪的情况,并使用该正则表达式的结果来确定所需的子字符串边界:

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]
    }

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

子字符串实现是否复制原始字符串的数据?如果是这样,首先,当需要修剪字符串时,会进行双重遍历,首先在正则表达式中(可能是部分),然后在子字符串提取中。希望子字符串实现仅引用原始字符串,因此子字符串之类的操作几乎可以免费使用。正则表达式 impl 中的捕获有多好?中期,即产出价值,可能会很长。我还没有准备好相信所有正则表达式 impls 的捕获都不会在几百 KB 的输入捕获中犹豫不决,但我也没有测试(运行时太多,抱歉!)。第二个总是运行捕获;如果您的引擎可以做到这一点而不会受到影响,也许使用上面的一些绳索技术,请务必使用它!


C
Codler

适用于 IE9+ 等浏览器

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