2009-09-03 12 views
15

Eventuali duplicati:
How can I convert ereg expressions to preg in PHP?Come cambiare eregi di PHP per funzione preg_match

ho bisogno di aiuto, sotto è un piccolo regex molto essenziale per convalidare un po 'una e-mail, mi rendo conto che fa non funziona il più grande ma per i miei bisogni è ok per ora.

utilizza attualmente la funzione eregi di PHP che php.net dice è ora una funzione ammortizzato e devo usare preg_match invece, la semplice sostituzione Erei con preg_match non funziona, qualcuno mi può mostrare come farlo funzionare?

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

Si noti che non si dovrebbe usare questa espressione regolare per convalidare e-mail; è severamente obsoleto. – Piskvor

+0

@Piskvor Sono d'accordo, anche questa domanda ha circa 5 anni =) dovresti postare una risposta aggiornata se vuoi e posso sempre cambiare la risposta "selezionata" all'approccio migliore – JasonDavis

+0

È IMHO al di fuori dell'ambito dell'ereg/problema preg; commentare mi sembra sufficiente. – Piskvor

risposta

25

I modelli di regex in stile Perl devono sempre essere delimitati. Il primo carattere della stringa è considerato il delimitatore, quindi qualcosa di simile:

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'; 
    } 
} 

Il motivo per il vostro tentativo iniziale non ha funzionato è perché stava cercando di usare ^ come il carattere delimitatore, ma (ovviamente) trovata nessuna corrispondenza ^ per la fine della regex.

+0

Grazie, ho appena trovato FILTER_VALIDATE_EMAIL di php, sembra che potrebbe essere il modo migliore per andare ma non riesco a trovare molte informazioni su di esso – JasonDavis

+2

@jasondavis, 'FILTER_VALIDATE_EMAIL' sarebbe sicuramente una scelta migliore. Le e-mail sono ** complicate **. – TRiG

10

Sarà necessario cambiare tre cose

  1. necessità di aggiungere delimitatori modello (può essere qualsiasi carattere, ma più comunemente una barra)
  2. [[: alnum:]] dovranno essere sostituiti con l'equivalente PCRE
  3. "i" in "eregi" significa non sensibile alla distinzione tra maiuscole e minuscole, che PCRE esegue con un flag, in particolare il flag i.

In caso contrario, il resto sembra PCRE compatibile (sì, questo è il tipo di ridondante = P)

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

PCRE di PHP include cose come [: alnum:] come opzioni. – Amber

Problemi correlati