2011-01-31 6 views
9

イム電子メールの形式を確認する方法をvalidates_format_of使用:ruby​​ regexをjavascriptに翻訳するには? - :とRails 3.0.3

validates_format_of :email, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i 

もイム私のコードでImはなって、フォームを検証するためにlivevalidationプラグインを使用して:

(I-MX ..?)
(?i-mx:^([^@\\s]+)@((?:[-a-z0-9]+\\.)+[a-z]{2,})$) 

Javascript cantはこの正規表現を読み取ります。どのようにしてこの正規表現を元のように変更できますか:

/^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i 

+0

この質問の関連検索結果[こちらをご覧ください](https://www.google.com/#hl=en&safe=active&sclient=psy-ab&q=(%7Ctranslateに変換)+ ruby​​ + regex + to + javascript&oq =(変換%7Ctranslate)+ ruby​​ +正規表現+ to + javascript&gs_l = serp.3 ... 6611.13840.0.14133.12.0.0.0.0.123.1024.9j3.12.0.les%3B..0.0 ... 1c.1.4。 psy-ab.OIu4b055si4&pbx = 1&bav = on.2、または.r_gc.r_pw.r_cp.r_qf。&fp = 50b26647ad5972f8&biw = 1366&bih = 639)。 –

答えて

1

理由は、.inspectの代わりに.to_sを使用して正規表現を変換しているためです。あなたの見解では、.inspectを使用して適切なフォーマットを取得する必要があります。ここでは、問題を説明しなければならないいくつかのサンプルコードは次のとおりです。

email = /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i 
email.to_s #"(?i-mx:^([^@\\s]+)@((?:[-a-z0-9]+\\.)+[a-z]{2,})$)" 
email.inspect #"/^([^@\\s]+)@((?:[-a-z0-9]+\\.)+[a-z]{2,})$/i" 

ので、あなたのjavascriptのビューにしたい、実際の文字列表現を取得するには、このような何かを:

<%= email.inspect %> 
7

RubyとJavaScriptの正規表現がされています異なる機能を持つ異なるエンジンによって解析され、実行されます。このため、RubyとJavaScriptの正規表現には、微妙な相違があり、若干互換性がありません。彼らが直接翻訳していないことに気づいていれば、JavaScriptで簡単なRubyの正規表現を表現することができます。

がここにwhat client side validations doesです:

class Regexp 
    def to_javascript 
    Regexp.new(inspect.sub('\\A','^').sub('\\Z','$').sub('\\z','$').sub(/^\//,'').sub(/\/[a-z]*$/,'').gsub(/\(\?#.+\)/, '').gsub(/\(\?-\w+:/,'('), self.options).inspect 
    end 
end 

最近addition of the routes inspector to railsは、おそらくより良い、それは猿のパッチ適用を避けるよう、a similar approachを取ります

def json_regexp(regexp) 
    str = regexp.inspect. 
     sub('\\A' , '^'). 
     sub('\\Z' , '$'). 
     sub('\\z' , '$'). 
     sub(/^\// , ''). 
     sub(/\/[a-z]*$/ , ''). 
     gsub(/\(\?#.+\)/ , ''). 
     gsub(/\(\?-\w+:/ , '('). 
     gsub(/\s/ , '') 
    Regexp.new(str).source 
end 

を次に、あなたのjavascriptのコードにこれらを挿入するために、のようなものを使用します。

var regexp = #{/^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i.to_javascript}; 
+1

'/[email protected]++..+/ iを変換すると、その期間を二重にエスケープします。つまり、動作しません。 –

+0

'puts /[email protected]+\..+/ i.to_javascript'は' /[email protected]++..+/ i'を与えます – sj26

+1

それは、現代のルビー正規表現エンジンは、合理的に互換性のある状態で正規表現を残して、多くの正規表現では翻訳する必要がないかもしれません。 Ruby 2.4.1では、例えば 'puts /[email protected]+\..+/ i.inspect'も' /[email protected]++..+/ i'を出力します – sj26

1

https://github.com/janosch-x/js_regex

それはGSUBのアプローチよりも多くのケースを扱うことができ、かつ任意の非互換性が残っている場合、警告が含まれています。3210私は、Rubyを変換し、小さな宝石はJavaScriptに正規表現書いています。

Rubyの正規表現エンジンhas a lot of features that JavaScript's doesn't haveのため、あなたが行っているすべてのRuby正規表現が完全にJSに変換されるわけではありません。

関連する問題