2010-06-28 36 views
9

$.trim()使用下面的正则表达式修剪的字符串:

/^(\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

UPDATE

它看起来就像你不能复制粘贴&这个例子字符串,在某些点的A0字符被替换。 Firebug console也将替换粘贴的字符,您必须在一个sepperate的html文件/编辑器中创建自己的字符串来测试这个。

+1

好像SO转换你的A0S为20秒(至少在我砍你的代码粘贴到Emacs)。 – 2010-06-28 13:19:32

+0

'$ .trim()'不使用那个正则表达式,事实上在大多数情况下它不使用正则表达式......你在看什么版本的jQuery? – 2010-06-28 13:19:48

+1

@Nick:该正则表达式自1.4.2起使用 – 2010-06-28 13:21:42

回答

9

这是一个known bug,如评论所说,和新月是正确的,它是这样的1.4.2,但它已经固定的下一个版本。

在这里你可以测试你的字符串String.prototype.trim速度:http://jsfiddle.net/dLLVN/
我得到在Chrome 117ms左右79ms在Firefox一百万运行......所以这将解决这一问题挂:)

至于修复程序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或没有,像这样:

+0

看到'trimLeft'和'trimRight'表达式也不错。 – jAndy 2010-06-28 13:49:10

+0

@jAndy - 他将它们作为链接发布。点击第一个提交链接。 – user113716 2010-06-28 13:52:55

+0

@jAndy - 添加了相关的位和链接到分支标签,所以你可以看到git的变化:) – 2010-06-28 13:55:38

5

事实证明,这种行为被张贴在jQuerys错误追踪一个月前:

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

感谢Andrew指着我说。

+0

这个bug报告很有趣,因为Trac似乎吃了uparrow角色。因此,破碎的“rtrim”和建议的修复看起来都不正确。 – Pointy 2010-06-28 13:44:38

+0

jAndy - +1我看到我一直在看最近的提交。 (感谢@Pointy让我高兴起来。)但是,我仍然无法得到正则表达式或$ .trim()(它们是相同的)在Firefox中失败。我不知道这是为什么。 – user113716 2010-06-28 13:46:53

7

一般都喜欢^\s+|\s+$的表达应该是足够的修整,因为\s应该匹配所有空格字符,即使是\0xa0非分隔空格。这个表达应该运行而不会引起任何问题。

现在可能一些jQuery的希望支持的浏览器不匹配\s\0xa0解决此问题的jQuery添加的替代(\s|\0xa0),修剪掉非打破空间上的浏览器了。

通过此更改,正则表达式的第二部分看起来像(\s|\0xa0)+$,这导致在浏览器中出现问题,其中\0xa0也与\s相匹配。在包含长字符\0xa0字符的字符串中,每个字符可以与\s\0xa0相匹配,从而导致大量替代匹配和指数级许多组合,从而可以组合不同的匹配。如果这个\0xa0字符序列不在字符串的末尾,则无法满足尾部$的条件,无论哪个空格与\s匹配,哪些与\0xax匹配,但浏览器不知道这一点并尝试全部可能会搜索很长时间。

由于\s应该与所有Unicode空格字符匹配,而不仅仅是众所周知的ASCII字符,所以您建议的简化表达式将不够用。


MDC\s相当于[\t\n\v\f\r \u00a0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000]

+0

好的答案,很高兴知道。 – jAndy 2010-06-28 13:57:51