Javascript jQuerys$.trim(),是错误还是写得不好?
使用以下RegExp修剪字符串:Javascript jQuerys$.trim(),是错误还是写得不好?,javascript,jquery,regex,Javascript,Jquery,Regex,使用以下RegExp修剪字符串: /^(\s|\u00A0)+|(\s|\u00A0)+$/g 事实证明,这可能非常难看,例如: var mystr = ' some test -- more text new test xxx'; mystr = mystr.replace(/^(\s|\u00A0)+|(\s|\u00A0)+$/g, ""); 这段代码将挂起Fi
/^(\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)
字符。只有在字符串中没有前缀空格/A0
时,才会出现此“问题”。我不知道为什么会这样
这句话:
/^[\n\r\t \xA0]+|[\n\r\t \xA0]$/g
在所有测试场景中都可以正常工作。也许有更好的模式
资料来源:
更新
看起来您无法复制和粘贴此示例字符串,在某些情况下,
A0
字符将被替换<代码>Firebug控制台也将替换粘贴时的字符,您必须在seperate html文件/编辑器中创建自己的字符串来测试此操作。事实证明,此行为一个月前发布在jQuerys bugtracker上:
感谢Andrew向我指出这一点。正如评论中所说,这是一个错误,新月号在1.4.2中采用这种方式是正确的,但它已经在下一版本中修复
您可以在此处测试字符串上String.prototype.trim
的速度:我在Firefox的Chrome 117ms上运行了大约79ms,运行了一百万次……所以这将解决悬而未决的问题:) 至于修复,现在使用本机修剪 3月份有2次提交:
:
:
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]+$/;
}
通常,像
^\s+|\s+$
这样的表达式应该足以进行修剪,因为\s
应该匹配所有空格字符,甚至\0xa0
不间断空格1。此表达式应在不引起任何问题的情况下运行
现在,jQuery想要支持的某些浏览器可能与\0xa0
和\s
不匹配,为了解决这个问题,jQuery添加了另一个(\s |\0xa0)
,来修剪该浏览器上不间断的空格
通过此更改,正则表达式的第二部分看起来像(\s|\0xa0)+$
,这会导致浏览器出现问题,其中\0xa0
也与\s
匹配。在包含一长串\0xa0
字符的字符串中,每个字符都可以由\s
或\0xa0
进行匹配,从而产生大量替代匹配和指数级的组合,不同的匹配可以如何组合。如果此\0xa0
字符序列不在字符串末尾,则无论哪个空格由\s
匹配,哪个空格由\0xax
匹配,都无法满足尾随的$
条件,但浏览器不知道这一点并尝试所有组合,可能会搜索很长时间
您建议的简化表达式是不够的,因为\s
应该匹配所有unicode空格字符,而不仅仅是众所周知的ASCII字符
1据我所知,
\s
相当于[\t\n\v\f\r\u00a0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u200a\u200b\u2028\u2029\u3000]
似乎将您的a0转换为20(至少在我将您的代码剪切并粘贴到Emacs时是这样)@Nick:这个正则表达式从1.4开始使用。2@All当前位置请参见Peter Jaric的评论和我的更新。一个月前,在。灾难性的回溯,我经常这样做,但在代码中很少。@jAndy,也许你应该添加一个到问题源的链接,以避免误解:错误报告很有趣,因为Trac似乎会吃掉向上箭头的字符。因此,损坏的“rtrim”和建议的修复看起来都不正确。jAndy-+1我看到我一直在查看最近的提交。(感谢@Pointy给了我提示。)但是,我仍然不能让正则表达式或$.trim()
(两者相同)在Firefox中失败。我想知道这是为什么。如果能看到trimleet
和trimlright
表达式,那就太好了。@jAndy-他把它们作为链接发布了。单击第一个提交链接。@jAndy-将相关位和链接添加到分支标记,以便您可以看到git中的更改:)
//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 = /^\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]+$/;
}