$.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
”包含空格,但大多数是hex 160(A0)
个字符。如果没有前置whitespace/A0
,但是在字符串中的某处,只会发生这个“问题”。我不知道为什么会这样。
这个表达式:
/^[\n\r\t \xA0]+|[\n\r\t \xA0]$/g
在所有测试场景中都能正常工作。也许是一个更好的模式?
来源:http://code.jquery.com/jquery-1.4.2.js
更新
看起来您无法复制和粘贴此示例字符串,在某些点上会替换A0
个字符。 Firebug console
也将替换粘贴上的字符,你必须在一个单独的html文件/编辑器中创建自己的字符串来测试它。
答案 0 :(得分:9)
这是一个known bug,如评论中所述,而Crescent在 1.4.2 中就是这样,但它已经在下一个版本中得到修复。
您可以在此处测试字符串String.prototype.trim
的速度:http://jsfiddle.net/dLLVN/
我在Chrome浏览器中获得了大约79毫秒的Chrome浏览器,持续了100万次...所以这将解决悬而未决的问题:)
至于修复take a look at the current source that'll be in 1.4.3,现在使用原生修剪。
3月份有2次提交:
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]+$/;
}
答案 1 :(得分:7)
正常情况下,像^\s+|\s+$
这样的表达式应足以修剪,因为\s
应该匹配所有空格字符,甚至\0xa0
非破坏空格 1 。该表达式应该运行而不会引起任何问题。
现在,jQuery想要支持的某些浏览器与\0xa0
的{{1}}不匹配,为了解决这个问题,jQuery添加了替代\s
,以修剪不间断的空格在那个浏览器上也是。
通过此更改,正则表达式的第二部分看起来像(\s|\0xa0)
,这会导致(\s|\0xa0)+$
也与\0xa0
匹配的浏览器出现问题。在包含长\s
个字符序列的字符串中,每个字符可以由\0xa0
或\s
匹配,从而导致许多替代匹配和指数级多种组合如何组合不同的匹配。如果此\0xa0
个字符序列不在字符串的末尾,则无论\0xa0
匹配哪个空格以及{匹配哪个空格},都无法满足尾随$
条件。 {1}},但浏览器不知道这一点并尝试所有组合,可能会搜索很长时间。
你建议的简化表达式是不够的,因为\s
应该匹配所有unicode空格字符,而不仅仅是众所周知的ASCII字符。
1 根据MDC,\0xax
相当于\s
答案 2 :(得分:5)