2011-01-31 9 views
9

Im utilizzando validates_format_of metodo per controllare formato email:Come tradurre ruby ​​regex in javascript? -: e Rails 3.0.3

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

anche Im usando plug LiveValidation per convalidare le forme, così nel mio codice Im ottenendo:

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

Javascript non posso leggere questo regex. Come o dove posso cambiare questo regex per essere come originale:

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

?

+0

Risultati di ricerca pertinenti per questa domanda [può essere trovato qui] (https://www.google.com/#hl=en&safe=active&sclient=psy-ab&q= (convert% 7Ctranslate) + ruby ​​+ regex + a + javascript e oq = (convertire% 7Ctranslate) + rubino + regex + per + javascript & gs_l = serp.3 ... 6611.13840.0.14133.12.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, or.r_gc.r_pw.r_cp.r_qf. & fp = 50b26647ad5972f8 & biw = 1366 & bih = 639). –

risposta

1

La ragione è che stai convertendo la tua espressione regolare usando .to_s invece di .inspect. Quello che devi fare nella tua vista è usare .inspect per ottenere il formato corretto. Ecco alcuni esempi di codice che dovrebbe spiegare il problema:

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" 

così, a suo avviso javascript fare qualcosa di simile per ottenere la rappresentazione stringa effettiva che si desidera:

<%= email.inspect %> 
7

di Ruby e JavaScript espressioni regolari sono analizzato ed eseguito da diversi motori con diverse capacità. Per questo motivo, le espressioni regolari di Ruby e JavaScript hanno differenze piccole e sottili che sono leggermente incompatibili. Se sei consapevole che non traducono direttamente, puoi comunque rappresentare semplici espressioni regolari di Ruby in JavaScript.

Ecco 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 

La recente addition of the routes inspector to rails prende a similar approach, forse anche meglio in quanto evita scimmia patching:

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 

Poi per inserire questi nel codice javascript, usare qualcosa come:

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

La conversione di '/[email protected]+\..+/ i' porta al doppio escape del periodo, cioè non funziona. –

+0

Sembra funzionare bene per me: 'puts /[email protected]+\..+/ i.to_javascript' dà' /[email protected]+\..+/ i' – sj26

+1

Detto questo, il moderno motore di regexp rubino sembra lasciare le espressioni regolari in uno stato ragionevolmente compatibile, quindi per molte espressioni regolari potrebbe non essere necessario tradurre. Su Ruby 2.4.1, ad esempio: 'puts /[email protected]+\..+/ i.inspect' restituisce anche' /[email protected]+\..+/ i' – sj26

Problemi correlati