【发布时间】:2010-09-16 20:25:25
【问题描述】:
JavaScript 似乎没有原生的trim() 方法。如何使用 JavaScript 修剪字符串开头和结尾的空格?
【问题讨论】:
标签: javascript jquery string trim
JavaScript 似乎没有原生的trim() 方法。如何使用 JavaScript 修剪字符串开头和结尾的空格?
【问题讨论】:
标签: javascript jquery string trim
我将它与原生 JavaScript 一起使用
// Adding trim function to String object if its not there
if(typeof String.prototype.trim !== 'function') {
String.prototype.trim = function() {
return this.replace(/^\s+|\s+$/g, '');
}
}
这样使用
var myString = " some text ";
alert(myString.trim());
示例
// Adding trim function to String object if its not there
if(typeof String.prototype.trim !== 'function') {
String.prototype.trim = function() {
return this.replace(/^\s+|\s+$/g, '');
}
}
var str = " some text ";
console.log(str.trim());
【讨论】:
您可以使用以下...
function trim(str) {
try {
if (str && typeof(str) == 'string') {
return str.replace(/^\s*|\s*$/g, "");
} else {
return '';
}
} catch (e) {
return str;
}
}
【讨论】:
这是一个老问题,但这些都不适合我。我只需要修剪前导和尾随空格,这就是我所做的。我的 div 标签有一个 id = start-date。
$("#start-date").text().trim()
【讨论】:
我知道这个问题很古老,但现在,Javascript 实际上确实有一个原生的 .trim()
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/Trim
【讨论】:
这可能不是最快的,并且可能违反“.trim()”可能真正应该是的,但我不喜欢正则表达式(主要是因为要花很多时间来弄清楚它们的真正含义/做什么)而且我喜欢有一些我知道不管我是否有 jQuery 都可以工作的东西(更不用说正确的版本,因为我用 jQuery 1.4.2 尝试了 $.trim(myVar) 并且它不起作用),并且会得到摆脱所有额外的空间,而不仅仅是在最后,像它应该的那样重建它:
function Trim(obj) {
var coll = "";
var arrObj = obj.split(' ');
for (var i=0;i<arrObj.length;i++) {
if (arrObj[i] == "") {
arrObj.splice(i,1); // removes array indices containing spaces
}
}
//alert(arrObj.length); // should be equal to the number of words
// Rebuilds with spaces in-between words, but without spaces at the end
for (var i=0;i<arrObj.length;i++) {
if (arrObj[i] != "" && i != arrObj.length-1)
coll += arrObj[i] + " ";
if (arrObj[i] != "" && i == arrObj.length-1)
coll += arrObj[i];
}
return coll;
}
【讨论】:
我考虑了一个修剪功能速度。这个函数明显击败了所有 24 个竞争对手(其中许多使用正则表达式)以及 Chrome 和 Chromium(!) 的原生 string.trim(),并且执行速度与 Safari 的 trim() 一样快。测试结果在这里:http://jsperf.com/mega-trim-test/7
function trim27(str) {
var c;
for (var i = 0; i < str.length; i++) {
c = str.charCodeAt(i);
if (c == 32 || c == 10 || c == 13 || c == 9 || c == 12)
continue; else break;
}
for (var j = str.length - 1; j >= i; j--) {
c = str.charCodeAt(j);
if (c == 32 || c == 10 || c == 13 || c == 9 || c == 12)
continue; else break;
}
return str.substring(i, j + 1);
}
该函数修剪字符“\n\r\t\f”,但添加更多空白字符很容易,例如。那些正则表达式用作空格 (\s) 的那些只有轻微的性能损失(请参阅http://jsperf.com/mega-trim-test/8)。
编辑:之前的 trim27() 只修剪最常见的字符(“\n\r\t\f”),但为了修剪所有可能的空格,我在下面添加了一个新函数 mytrim():
if (!String.prototype.trim || "\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF".trim() || navigator.userAgent.toString().toLowerCase().indexOf("chrome") != -1)
var mytrim = function(str) {
var c;
for (var i = 0; i < str.length; i++) {
c = str.charCodeAt(i);
if (c == 32 || c == 10 || c == 13 || c == 9 || c == 12 || c == 11 || c == 160 || c == 5760 || c == 6158 || c == 8192 || c == 8193 || c == 8194 || c == 8195 || c == 8196 || c == 8197 || c == 8198 || c == 8199 || c == 8200 || c == 8201 || c == 8202 || c == 8232 || c == 8233 || c == 8239 || c == 8287 || c == 12288 || c == 65279)
continue; else break;
}
for (var j = str.length - 1; j >= i; j--) {
c = str.charCodeAt(j);
if (c == 32 || c == 10 || c == 13 || c == 9 || c == 12 || c == 11 || c == 160 || c == 5760 || c == 6158 || c == 8192 || c == 8193 || c == 8194 || c == 8195 || c == 8196 || c == 8197 || c == 8198 || c == 8199 || c == 8200 || c == 8201 || c == 8202 || c == 8232 || c == 8233 || c == 8239 || c == 8287 || c == 12288 || c == 65279)
continue; else break;
}
return str.substring(i, j + 1);
};
else var mytrim = function(str) {
return str.trim();
}
这样使用:
var foo = mytrim(" \n \t Trimmed \f \n "); // foo is now "Trimmed"
上面的 mytrim() 做了以下事情:
【讨论】:
嗯,正如很多人常说的,trim 函数工作得很好,但如果您不想使用整个框架来执行trim,那么看看它的实现可能会很有用。所以这里是:
function( text ) { return (text || "").replace( /^(\s|\u00A0)+|(\s|\u00A0)+$/g, "" );}
与这里已经提出的其他解决方案相比,我在此实施中看到的主要优势是:
【讨论】:
m 标志,g 标志在这里没有用处。
我用这个:
使用函数。
function trim($) {
return (typeof $ == "function" ? $() : $).replace(/[\s]*/g,"")
}
code example:
trim((function(){ return "a b"})) // ab
trim(" a b") //ab
【讨论】:
使用Ariel Flesler's fast trim function:
// Licensed under BSD
function myBestTrim( str ){
var start = -1,
end = str.length;
while( str.charCodeAt(--end) < 33 );
while( str.charCodeAt(++start) < 33 );
return str.slice( start, end + 1 );
};
不过,我的解决方案是这样的(因为 Firefox 3.5 及更高版本中的 String 对象已经有一个 trim method):
String.prototype.trim = String.prototype.trim || function () {
var start = -1,
end = this.length;
while( this.charCodeAt(--end) < 33 );
while( this.charCodeAt(++start) < 33 );
return this.slice( start, end + 1 );
};
【讨论】:
我用这个。
String.prototype.trim = function() {
return this.replace(/^\s+|\s+$/g,"");
}
【讨论】:
为什么不直接修改 String 原型呢?为什么不从开源库中窃取修剪功能,就像我在 YUI 中所做的那样? (你真的需要为这个简单的任务加载整个框架吗?)把它们放在一起,你就得到了:
String.prototype.trim = function() {
try {
return this.replace(/^\s+|\s+$/g, "");
} catch(e) {
return this;
}
}
var s = " hello ";
alert(s.trim() == "hello"); // displays true
【讨论】:
Microsoft .NET 还具有 String.trim 函数作为 JavaScript 基本类型扩展的一部分。如果您正在编写 ASP.NET 应用程序,则可以使用它。
【讨论】:
对于 ltrim,将锚定在字符串开头的空格替换为空:
str2 = str.replace(/^\s+/,'');
对于 rtrim,将锚定在字符串末尾的空格替换为空:
str2 = str.replace(/\s+$/,'');
修剪:
str2 = str.replace(/^\s+|\s+$/g,'');
这些都使用正则表达式来完成实际工作。
【讨论】:
这么多 JavaScript 问题的答案:jQuery
$j.trim(string)
注意:以上假设您的 jQuery 已设置:
<script type="text/javascript">$j = jQuery.noConflict();</script>
这比“$”更明智,也比每次都输入“jQuery”更简洁。
【讨论】:
$j 比$ 更明智?
【讨论】:
【讨论】:
@Pat's 的稍微小一点的版本。
return str.replace( /^\s+|\s+$/g, '' );
【讨论】:
正如其他一些人已经指出的那样,通常最好使用第三方 JS 库来做这种事情。并不是说 trim() 是一个自己构建的复杂函数,但是有很多函数不是 JavaScript 原生的,你可能需要并最终自己编写,使用库很快就会变得更具成本效益。
当然,使用 JS 库的另一个优点是作者努力确保这些函数在所有主流浏览器上都能正常工作,这样您就可以对标准接口进行编码,而忘记 Internet 之间令人讨厌的差异Explorer 和所有其他浏览器。
【讨论】:
根据this page,最好的全能方法是
return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
当然如果你使用的是 jQuery ,它会为你提供优化的修剪方法。
【讨论】: