2014-02-14 61 views
1

我最近切換到Rails 4和安全要求似乎不再允許使用/^..$/風格的正則表達式。該錯誤指出正則表達式應改爲以/\A..\z/的樣式編寫。做出這一改變似乎解決了我所有的服務器端驗證問題,但不幸的是,它也打破了我在javascript中的所有客戶端驗證。RegExp A z does not work,但多數民衆贊成什麼Rails 4要求

一個簡單的例子。我想驗證用戶名是字母,數字還是句點。

舊的正則表達式看起來像/^[0-9a-zA-Z.]+$/和工作兩者服務器端(Rails的3.X)和客戶端

new RegExp(/^[0-9a-zA-Z.]+$/).test('myuser.name') = true 

新的正則表達式看起來像/\A[0-9a-zA-Z.]+\z/和工作服務器端,但未能客戶端

new RegExp(/\A[0-9a-zA-Z.]+\z/).test('myser.name') = false 

所以我清楚自己做錯事,但我似乎無法找到任何解釋。我檢查了\ A \ \ z是有效的正則表達式,以確保它不是一些Rails特定的黑客攻擊,它似乎是合法的。

任何想法?

+0

[MDN Regular Expressions](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions) – epascarello

回答

4

JavaScript不支持\A\zRegExp

這裏的一些原始數據,首先對JavaScript:

var a = "hello\nworld" 
(/^world/).test(a) // false 
(/^world/m).test(a) // true 
(/hello$/).test(a) // false 
(/hello$/m).test(a) // true 

接下來,紅寶石:

a = "hello\nworld" 
a.match(/^world/) # => #<MatchData "world"> 
a.match(/\Aworld/) # => nil 
a.match(/hello$/) # => #<MatchData "hello"> 
a.match(/hello\z/) # => nil 

由此,我們看到,Ruby的\A\z相當於JavaScript的^$只要你不使用多行m修飾符。如果您擔心輸入具有多行,那麼您只需要在這兩種語言之間就這些匹配字符翻譯正則表達式。