2009-09-03 20 views
15

Duplicar posible:
How can I convert ereg expressions to preg in PHP?Cómo cambiar eregi de PHP para preg_match

necesito ayuda, a continuación es una pequeña expresión regular muy básico para validar un poco un correo electrónico, me doy cuenta de que lo hace no funciona el mejor, pero para mis necesidades está bien por ahora.

la actualidad utiliza la función de PHP eregi, que dice php.net es ahora una función depreciado y yo debería usar preg_match lugar, la simple sustitución de Erei con preg_match no funciona, alguien me puede mostrar cómo hacer que funcione?

function validate_email($email) { 
    if (!eregi("^[[:alnum:]][a-z0-9_.-]*@[a-z0-9.-]+\.[a-z]{2,4}$", $email)) { 
     echo 'bad email'; 
    } else { 
     echo 'good email'; 
    } 
} 
function validate_email($email) { 
    if (!preg_match("^[[:alnum:]][a-z0-9_.-]*@[a-z0-9.-]+\.[a-z]{2,4}$", $email)) { 
     echo 'bad email'; 
    } else { 
     echo 'good email'; 
    } 
} 
+0

Tenga en cuenta que no debe utilizar esta expresión regular para validar el correo electrónico; está muy desactualizado. – Piskvor

+0

@Piskvor Estoy de acuerdo, esta pregunta tiene casi 5 años también =) debe publicar una respuesta actualizada si lo desea y siempre puedo cambiar la respuesta "seleccionada" al mejor enfoque – JasonDavis

+0

Es IMHO fuera del alcance de la ereg/problema de preg; comentar me parece suficiente. – Piskvor

Respuesta

25

Perl-style regex patterns siempre deben estar delimitados. El primer carácter de la cadena es considerado como el delimitador, por lo menos así:

function validate_email($email) { 
    if (!preg_match("/^[[:alnum:]][a-z0-9_.-]*@[a-z0-9.-]+\.[a-z]{2,4}$/i", $email)) { 
     echo 'bad email'; 
    } else { 
     echo 'good email'; 
    } 
} 

La razón de su intento inicial no funcionó es porque estaba tratando de utilizar ^ como el carácter delimitador, pero (obviamente) encontró no coincide ^ para el final de la expresión regular.

+0

Gracias, acabo de encontrar el FILTER_VALIDATE_EMAIL de php, parece que podría ser la mejor manera de hacerlo, pero no puedo encontrar mucha información sobre él – JasonDavis

+2

@jasondavis, 'FILTER_VALIDATE_EMAIL' definitivamente sería una mejor opción. Los correos electrónicos son ** complicados **. – TRiG

10

Tendrá que cambiar tres cosas

  1. necesidad de agregar delimitadores de patrones (puede ser cualquier carácter, pero más comúnmente una barra inclinada)
  2. [[: alnum:]] tendrá que ser reemplazado con el equivalente PCRE
  3. La "i" en "eregi" no distingue entre mayúsculas y minúsculas, lo que PCRE hace con una bandera, específicamente la bandera i.

De lo contrario, el resto se ve PCRE compatibles (sí, eso es un poco redundante = P)

"/^[a-z0-9][a-z0-9_.-]*@[a-z0-9.-]+\.[a-z]{2,4}$/i" 
+1

PHP PCRE incluye cosas como [: alnum:] como opciones. – Amber

Cuestiones relacionadas