Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuerys$.trim(),是错误还是写得不好?_Javascript_Jquery_Regex - Fatal编程技术网

Javascript jQuerys$.trim(),是错误还是写得不好?

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

使用以下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)
字符。只有在字符串中没有前缀
空格/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]+$/;
}