$.trim()
使用以下RegExp来修剪字符串:
/^(\s|\u00A0)+|(\s|\u00A0)+$/g
事实证明,这可能很丑陋,例如:
var mystr = ' some test -- more text new test xxx'; mystr = mystr.replace(/^(\s|\u00A0)+|(\s|\u00A0)+$/g,"");
此代码挂起Firefox和Chrome,它只是永远都是这样. “mystr”包含空格,但主要是十六进制160(A0)字符.这个“问题”只会发生,如果没有前缀的空格/ A0,但在字符串内的某个地方.我不知道为什么会发生这种情况.
这个表达:
/^[\n\r\t \xA0]+|[\n\r\t \xA0]$/g
在所有测试场景中工作正常.也许是更好的模式吗?
资料来源:http://code.jquery.com/jquery-1.4.2.js
UPDATE
看起来您无法复制并粘贴此示例字符串,在某些点,这些A0字符被替换. Firebug控制台还将替换粘贴上的字符,您必须在sepepate html文件/编辑器中创建自己的字符串来测试此.
解决方法
正如在评论中所说的那样,这是一个
known bug,而Crescent在1.4.2中是正确的,但是下一个版本已经解决了.
您可以测试字符串中String.prototype.trim的速度:http://jsfiddle.net/dLLVN/
在Firefox中,我可以在Firefox中运行大约79ms,在Firefox中运行一百万次,所以这将修复挂起的问题:)
至于修复,take a look at the current source that’ll be in 1.4.3,现在的修剪现在使用.
为此进行了2次提交:
> http://github.com/jquery/jquery/commit/141ad3c3e21e7734e67e37b5fb39782fe11b3c18
> http://github.com/jquery/jquery/commit/ba8938d444b9a49bdfb27213826ba108145c2e50
trim: function( text ) { return (text || "").replace( rtrim,"" ); },
//earlier: trim = String.prototype.trim //new trim here trim: trim ? function( text ) { return text == null ? "" : trim.call( text ); } : // Otherwise use our own trimming functionality function( text ) { return text == null ? "" : text.toString().replace( trimLeft,"" ).replace( trimRight,"" ); }
trimLeft和trimRight有所不同,具体取决于您是否在IE中,如下所示:
trimLeft = /^\s+/,trimRight = /\s+$/,// Verify that \s matches non-breaking spaces // (IE fails on this test) if ( !/\s/.test( "\xA0" ) ) { trimLeft = /^[\s\xA0]+/; trimRight = /[\s\xA0]+$/; }