jQuery $ .trim(),bug还是编写不好?

时间:2010-06-28 13:06:11

标签: javascript jquery regex

$.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文件/编辑器中创建自己的字符串来测试它。

3 个答案:

答案 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次提交:


1.4.2 $.trim() function

trim: function( text ) {
    return (text || "").replace( rtrim, "" );
},

1.4.3 $.trim() function

//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, "" );
  }

trimLefttrimRight会有所不同,具体取决于您是否在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)

事实证明,这个行为是在一个月前发布在jQuerys bugtracker上的:

http://dev.jquery.com/ticket/6605

感谢Andrew指点我。