2011-01-31 16 views
9

Im usando validates_format_of método para comprobar el formato de correo electrónico:¿Cómo traducir ruby ​​regex a javascript? -: Rieles y 3.0.3

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

también Im usando el plugin de LiveValidation para validar formas, por lo que en mi código Im que consigue:

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

Javascript cant leer esta expresión regular. Cómo o dónde puedo cambiar esta expresión regular para que sea tan original:

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

?

+0

Resultados de búsqueda relevantes para esta pregunta [se pueden encontrar aquí] (https://www.google.com/#hl=en&safe=active&sclient=psy-ab&q= (convert% 7Ctranslate) + ruby ​​+ regex + to + javascript & oq = (convertir% 7Ctranslate) + ruby ​​+ regex + a + 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). –

Respuesta

1

La razón es que está convirtiendo su expresión regular usando .to_s en lugar de .inspect. Lo que debe hacer a su vista es utilizar. Asegúrese de obtener el formato adecuado. Aquí hay un código de ejemplo que debe explicar el 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" 

así, en su opinión Javascript a hacer algo como esto para conseguir la representación de cadena real que se desea:

<%= email.inspect %> 
7

Ruby y JavaScript expresiones regulares son analizado y ejecutado por diferentes motores con diferentes capacidades. Debido a esto, las expresiones regulares de Ruby y JavaScript tienen diferencias pequeñas y sutiles que son ligeramente incompatibles. Si eres consciente de que no traducen directamente, aún puedes representar expresiones regulares sencillas de Ruby en JavaScript.

Aquí es 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 reciente addition of the routes inspector to rails toma a similar approach, tal vez incluso mejor, ya que evita mono parches:

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 

Luego de insertar estos en su código javascript, usar algo como:

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

Convirtiendo '/[email protected]+\..+/ i' lleva al doble escapa el período, es decir, no funciona. –

+0

Parece que funciona bien para mí: 'puts /[email protected]+\..+/ i.to_javascript' da' /[email protected]+\..+/ i' – sj26

+1

Dicho esto, el moderno motor de expresiones regulares ruby ​​parece para dejar las expresiones regulares en un estado razonablemente compatible, por lo que para muchas expresiones regulares puede que no necesite traducir. En Ruby 2.4.1, por ejemplo: 'puts /[email protected]+\..+/ i.inspect' también produce' /[email protected]+\..+/ i' – sj26

1

He escrito una pequeña joya que se traduce Rubí expresiones regulares de JavaScript:

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

Puede manejar más casos que el enfoque gsub, y incluye advertencias si siguen siendo posibles incompatibilidades.

Tenga en cuenta que, haga lo que haga, no todas las expresiones regulares de Ruby se pueden traducir completamente a JS, porque el motor de expresiones regulares de Ruby has a lot of features that JavaScript's doesn't have.

Cuestiones relacionadas