2011-09-06 49 views
2

我正在研究一个项目,目前无法有任何第三方JS库(否则这将是一件轻而易举的jQuery)。这个项目中的一件事是表单验证。除了我的正则表达式的一些小问题外,我的工作还算顺利。正则表达式 - 新的RegExp()全局搜索/替换字符串

我在文本字段的change()上触发了一个验证函数,所以如果你选中并出现错误,你会立即知道。用良好的数据标签出来,你会立即知道。如果验证失败,我将错误类分配给父元素。如果您只验证一次,此工作正常。如果你把测试失败,错误类建立,例如,如果你失败了验证2X,你结了:

<p class=" error"> 

如果你失败了3次,你会结束:

<p class=" error error"> 

如果验证通过,我会调用下面的removeClass()函数。基本上,它看起来并不像我正在进行全球搜索/替换。我确信添加全局修饰符会照顾上面的情况,但它不会,它只会删除一个“错误”类。

removeClass: function (el, name) { 
    var regex = new RegExp('(^|\\s)' + name + '(\\s|$)', 'gi'); 
    el.className = el.className.replace(regex, ' '); 
} 

我的正则表达式只是找线或白空间,其次是“错误”的开头,后面紧跟空白或行结束。当然,我承认吸吮正则表达式:)

任何东西都跳出来了吗?

回答

3

它在全球范围内工作,但是当找到匹配项时,下一次尝试的匹配从前一匹配中最后一个字符后面的字符开始,即第二个error中的e,而不是前面的空格。

// v-----v-------first match 
    " error error" 
//   ^------continues here, no more matches because 
//      there isn't a space before `e`. 

为了测试它,在两个类之间添加第二个空格,它将起作用。

// v-----v-------first match 
    " error error" 
//   ^------continues here, and now it will match 

修复程序是使用\\b代替,这不符合任何字符,所以下一场比赛将在以前error比赛的最后一个字符r后开始。

new RegExp('\\b' + name + '\\b', 'gi'); 

正如@Joseph指出,应以避免的空格字符积累在.replace()" "更改为空字符串""

+1

我比我更喜欢这个。 :P有一点值得注意的是,在这个例子中,你希望用空字符串('“”')替换,而不是在代码后面的部分用空格。 –

+0

@约瑟夫:好点。否则,如果多次添加和移除类,空间会累积。 – user113716

+0

如果您在该元素上有其他类名称,该怎么办? –