String strip() for JavaScript?
从字符串中去除前导和尾随空格的干净高效的JavaScript实现是什么?
例如:
" dog"。
江户十一〔一〕号
埃多克斯1〔2〕
埃多克斯1〔3〕
全部变成
江户十一〔四〕号
- 这个函数称为trim。参见developer.mozilla.org/en/core_javascript_1.5_reference/…
- @gumbo:trim有点更新,可能不支持跨浏览器。不知道,但是你永远无法通过跨浏览器的支持来判断。
使用此:
1 2 3 4 5 6 7
| if(typeof(String.prototype.trim) ==="undefined")
{
String.prototype.trim = function()
{
return String(this).replace(/^\s+|\s+$/g, '');
};
} |
trim函数现在将作为字符串上的一级函数提供。例如:
1
| " dog".trim() ==="dog" //true |
号
编辑:采纳J-P的建议,将regex模式组合成一个模式。还根据Christoph的建议添加了全局修改器。
以马修·克拉姆利关于在重新创建修剪功能之前嗅探它的想法为例。这是在客户机上使用的javascript版本较新的情况下完成的,因此它有自己的本机微调功能。
- 有关一些性能数据,请参阅blog.stevenlevithan.com/archives/faster-trim-javascript。
- 为了与ECMA规范兼容,trim()必须将this转换为字符串类型,即必须将this.replace(...)更改为String(this).replace(...)或('' + this).replace(...);这允许call()或apply()将函数转换为非字符串值。
- @克里斯托夫:你的意思是说在字符串中。prototype.trim()=…函数定义?我希望"this"已经引用了一个字符串,因为这是一个扩展字符串类型的原型函数。
- @大卫:是的,在函数中;ecma规范允许对非字符串对象(如String.prototype.trim.apply(42)或MyObj.prototype.trim = String.prototype.trim; new MyObj().trim();调用trim()。
- @克里斯托夫,我们能在42.ToString()或42+之前通过吗?
- 是的,但是如果您想要符合规范,您必须将转换放入trim()(正如我之前已经解释过的3条注释);另外,最好使用String(42)而不是42.toString(),因为前者不会创建不需要的包装器对象,并且是强制转换为类型字符串的规范方法。
- @大卫:否则,如果foo没有replace()方法,String.prototype.trim.apply(foo)就会抛出一个错误;规范允许这样的使用:"trim函数是有意通用的;它不要求其this值是字符串对象。"因此,它可以被转移到其他类型的对象中,用作一种方法。"
- @Christoph:我认为"this"实例没有replace方法,或者至少没有其他replace方法的唯一方法是由于用户干预(为instance.replace属性分配不同的函数)。在这种情况下,我理解你的观点。我只是想确定我理解你的陈述,因为我不明白一个字符串是如何被转换回一个字符串的,除了我在这里写的原因。
- 请注意,/\s/不会删除ES3规范定义的所有空白字符。我最近写了一些关于浏览器处理/\s/的方式-thinkweb2.com/projects/prototype/whitespace-deviations-以及如何解决它的问题。
- 奇怪的是,在许多浏览器中,原来的两个regex版本(replace(/^\s+/, '').replace(/\s+$/, '');)实际上速度稍快,因此不应出于性能考虑而选择一个regex版本。选择你觉得可读性更强的。
- @波宾斯:这是有道理的。交替可能会稍微降低regex引擎的速度,并且可能缺乏对它的优化。
- 为什么/s+s+/g不起作用?
- @用户132522:您是否试图用这种模式将多余的空白压缩成一个空格?如果是这样的话,它不适用于什么文本?
- 我明白了谢谢
对于jquery用户,$.trim(s)怎么样?
Gumbo已经在一条评论中指出了这一点,但这也重复了一个答案:trim()方法是在javascript 1.8.1中添加的,并且受到所有现代浏览器(firefox 3.5+、ie 9、chrome 10、safari 5.x)的支持,尽管ie 8及更高版本不支持它。用法很简单:
1 2
| " foo
\t ".trim() =>"foo" |
。
另请参见:
- https://developer.mozilla.org/en/javascript/reference/global_objects/string/trim
- http://msdn.microsoft.com/en-us/library/windows/apps/ff679971%28v=vs.94%29.aspx
小精灵
这是我使用的功能。
1 2 3
| function trim(s){
return ( s || '' ).replace( /^\s+|\s+$/g, '' );
} |
MDN中更好的Polyfill,支持删除BOM和nbsp:
1 2 3 4 5
| if (!String.prototype.trim) {
String.prototype.trim = function () {
return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
};
} |
请记住,修改内置原型会带来性能损失(由于JS引擎对许多运行时优化进行了限制),在性能关键的情况下,您可能需要考虑定义myTrimFunction(string)的替代方法。也就是说,如果您的目标是一个没有本机.trim()支持的旧环境,那么您可能会遇到更重要的性能问题。
StevenLevithan曾经写过如何实现更快的javascript修剪。这绝对值得一看。
如果您已经在使用jquery,那么您可能需要查看已经随jquery提供的jQuery.trim()。
如果不是编写新的代码来修剪字符串,而是查看调用"strip()"的现有代码,并想知道为什么它不能工作,那么您可能需要检查它是否尝试包含类似于原型pejs框架的内容,并确保它确实被加载。这个框架向所有字符串对象添加了一个strip函数,但是如果您升级了它,并且您的网页仍然引用旧的.js文件,那么它当然不会工作。