从字符串开头和结尾删除空格

159

我正试图找到一种方法来删除标题字符串开头和结尾的空格。我正在使用以下代码,但似乎并不起作用:

title = title.replace(/(^[\s]+|[\s]+$)/g, '');
任何想法?

1
var s = ' 1 '; s = s.replace(/^\s+|\s+$/g, ''); alert('-' + s + '-'); // 它的工作原理是这样的,您不需要使用括号或方括号。 - ekerner
2
现在Javascript已经内置了.trim,所以这是现代浏览器的答案:https://dev59.com/EnA75IYBdhLWcg3w-OZA#3000900 - Ziggy
请参考这篇文章:http://javascriptstutorial.com/blog/trim-string/ - user5846985
function trim11 (str) { str = str.replace(/^\s+/, ''); for (var i = str.length - 1; i >= 0; i--) { if (/\S/.test(str.charAt(i))) { str = str.substring(0, i + 1); break; } } return str; } - Badri Gs
15个回答

223
注意:截至2015年,所有主要的浏览器(包括IE>=9)都支持String.prototype.trim()。这意味着对于大多数用例,简单地执行str.trim()是实现问题所需的最佳方法。

Steven Levithan分析了许多不同的JavaScript中trim实现的性能。

他的建议是:

function trim1 (str) {
    return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
}

对于“通用实现,快速跨浏览器”,

function trim11 (str) {
    str = str.replace(/^\s+/, '');
    for (var i = str.length - 1; i >= 0; i--) {
        if (/\S/.test(str.charAt(i))) {
            str = str.substring(0, i + 1);
            break;
        }
    }
    return str;
}

"如果你想在所有浏览器中异常快速地处理长字符串"

参考资料


21
新版Safari(5)、Chrome(5)、Firefox(3.6)和Opera(10.5)均支持原生的字符串trim方法。既然如此,我会为String.prototype分配一个方法(如果该方法不存在),而不是创建一个新的全局函数。 - kennebec
14
String.prototype.trim = String.prototype.trim || function trim() { return this.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); };这段代码的意思是,如果当前环境中不存在String.prototype.trim方法,那么就定义一个trim方法。该方法用于去除字符串前后的空格,并返回处理后的字符串。 - kojiro
3
我怀疑在 JavaScript 性能最近的改进之后,这个测试是否仍然像回答时那样相关或可靠。 - Eduardo
2
你为什么使用双白字符?也就是说,为什么要使用这个正则表达式 /^\s\s*/ 而不是这个 /^\s*/ - aemonge
为什么要使用 trim1trim11 - Marty Cortez
aemonge -- 没有看到幕后的情况下,匹配一个字符可能比匹配一个字符或者空值要快很多,而你的替代方案会触发替换操作,也可能是昂贵的。或者两者都有可能。 - Gerard ONeill

69

如果可以使用jQuery:

/**
 * Trim the site input[type=text] fields globally by removing any whitespace from the
 * beginning and end of a string on input .blur()
 */
$('input[type=text]').blur(function(){
    $(this).val($.trim($(this).val()));
});

或者简单地:

$.trim(string);

48

正如@ChaosPandion所提到的,String.prototype.trim方法已经被引入ECMAScript 5th Edition规范,一些实现已经包括了该方法,所以最好的方法是检测本地实现并仅在其不可用时声明它:

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

然后你可以简单地执行以下操作:

title = title.trim();

1
我对检查属性是否为函数的这种模因总是感到有点困惑。如果它不是函数,那么正确的行为真的是覆盖它吗?也许在这种情况下应该抛出一个错误。 - kojiro
1
@kojiro,嗯,也许抛出一个错误会不错,但我这样看:我正在尝试创建一个符合规范的“shim”,如果String.prototype.trim不是一个函数,那它就不是ECMAScript第5版规范中描述的String.prototype.trim方法。规范保证在ES5环境中,trim是一个函数对象。 - Christian C. Salvadó
7
抛出 { name: "UnlikelyPolyfillException", message: "有人真的在 String 原型上写了一个名为 'trim' 的属性,而这不是符合 ECMA 5 标准的 shim?拜托,这太疯狂了。" } - kojiro

35

我知道这是一个旧帖子,但我想分享我们的解决方案。在追求最短代码的过程中(不是每个人都喜欢简洁的正则表达式吗?),人们可以使用以下代码:

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

顺便说一下:我通过上面分享的链接(blog.stevenlevithan.com -- Faster JavaScript Trim)运行了相同的测试,这个模式在所有其他方式中都表现得最好!

在IE8中进行了测试,将其作为测试13。结果如下:

原长度:226002
trim1:110ms(长度:225994)
trim2:79ms(长度:225994)
trim3:172ms(长度:225994)
trim4:203ms(长度:225994)
trim5:172ms(长度:225994)
trim6:312ms(长度:225994)
trim7:203ms(长度:225994)
trim8:47ms(长度:225994)
trim9:453ms(长度:225994)
trim10:15ms(长度:225994)
trim11:16ms(长度:225994)
trim12:31ms(长度:225994)
trim13:0ms(长度:226002)


11

这里,这应该能满足你的所有需求。

function doSomething(input) {
    return input
              .replace(/^\s\s*/, '')     // Remove Preceding white space
              .replace(/\s\s*$/, '')     // Remove Trailing white space
              .replace(/([\s]+)/g, '-'); // Replace remaining white space with dashes
}

alert(doSomething("  something with  some       whitespace   "));

似乎\s\s多余,因为\s+就已经足够了,而且稍微更快一些。 - CaffGeek

11

ECMAScript 5支持trim方法,并且已在Firefox中实现。

trim - MDC


4

以下是我过去在js中使用的一些字符串修剪方法:

String.prototype.ltrim = function( chars ) {
    chars = chars || "\\s*";
    return this.replace( new RegExp("^[" + chars + "]+", "g"), "" );
}

String.prototype.rtrim = function( chars ) {
    chars = chars || "\\s*";
    return this.replace( new RegExp("[" + chars + "]+$", "g"), "" );
}
String.prototype.trim = function( chars ) {
    return this.rtrim(chars).ltrim(chars);
}

正则表达式 ^[\s*]+ 匹配字符串开头的 *,因此您的函数可以将 "*** Foo" 截断为 "Foo" - Ferdinand Beyer
可能 :) 不知道为什么没有人抱怨...我写那段代码已经很久了,它被用在http://en.wikipedia.org/wiki/Wikipedia:Twinkle中。现在看来很明显是开源的。 - azatoth

4

以下是我的当前代码,如果我注释掉第三行,第二行的代码可以运行,但如果保留它,就无法工作。

var page_title = $(this).val().replace(/[^a-zA-Z0-9\s]/g, '');
page_title = page_title.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
page_title = page_title.replace(/([\s]+)/g, '-');

使用polygenelubricants的代码,将页面标题修整为trim1(page_title)。 - ant
所以最终你想要清理这个字符串,使其成为修剪过的、字母数字和破折号,而不是空格作为分隔符? - CaffGeek
@chad 是的。动态创建Slug URL,以便用户可以看到他们的URL将是什么样子。类似于WordPress在创建新博客文章时的方式。 - James Jeffery

4

2

当DOM完全加载时,您可以将此添加到所有文本字段中。我从未遇到过需要提交前导或尾随空格的情况,因此在全局范围内始终执行此操作对我有用...

$(function() { $('input[type=text]').on('blur', function(){
    $(this).val($.trim($(this).val()));
  });
});

需要 jQuery。另一个问题(我没有测试):当我在一个字段中并按下 <kbd>enter</kbd> 发送表单时,blur 事件是否会在提交之前发生? - amenthes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接