2009-11-12 6 views
41

Sto provando a fare una query SQL, ma ho bisogno di verificare in qualche modo se il valore è un indirizzo email. Ho bisogno di un modo per verificare se $user è un indirizzo email, perché ho valori utente come questo nella mia tabella.Controlla se una stringa è un indirizzo email in PHP

test 
test2 
[email protected] 
[email protected] 
test392 
[email protected] 

e così via ...

ho bisogno di fare in modo $useremail controlli $user da trovare se si tratta di un indirizzo di posta elettronica. Così posso aggiornare i valori, WHERE user=test OR [email protected], ecc

$user = strtolower($olduser); 
$useremail = ""; 

mysql_query("UPDATE _$setprofile SET user=$sn, fc=$fc WHERE user='$user' OR user='$useremail"); 
+1

Perché è importante se un valore è un indirizzo email? Una stringa può essere un indirizzo email perfettamente formattato e non essere ancora valido, come 'StackOverflowIsAGreatWebsite @ whitehouse.gov'. Quindi, l'unico modo per sapere con certezza se un indirizzo è valido è provare a inviarlo per posta. E se non hai intenzione di mandarci una mail, perché ti importa? –

+0

@Daniel Pryden Ho memorizzato i nomi utente nel mio database. Voglio aggiornare i valori di posta elettronica ai valori normali, così quando ho eseguito il mio script, tira i dati nome utente dalle API, e quindi posso sostituire il valore e-mail vecchio, con il nuovo valore nome utente. È più comodo per la sceneggiatura che sto cercando di scrivere. – Homework

risposta

162

Senza espressioni regolari:

<?php 
    if(filter_var("[email protected]", FILTER_VALIDATE_EMAIL)) { 
     // valid address 
    } 
    else { 
     // invalid address 
    } 
?> 
+9

Tip Top! NB questo è PHP v5.2.0 o superiore solo – richsage

+0

Funzionato perfettamente. – Homework

+1

@richsage: A destra, l'estensione 'filter' è stata abilitata per default da PHP 5.2.0 (rilasciata 2006-11-02). Per le versioni precedenti di PHP, è possibile scaricare e installare l'estensione del filtro da PECL. –

6

È possibile utilizzare le espressioni regolari per convalidare la stringa di input per vedere se corrisponde a un indirizzo e-mail:

<?php 
$email = "[email protected]"; 
if(eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email)) { 
    echo "Valid email address."; 
} 
else { 
    echo "Invalid email address."; 
} 
?> 

da: http://www.totallyphp.co.uk/code/validate_an_email_address_using_regular_expressions.htm

EDIT: per le espressioni più precise, fare riferimento alla Travis answer su questa questione

+2

Che ne dite di '.info' e' .museum' tlds? – BalusC

+1

Oh, inoltre, come circa l'imminente decisione dell'ICANN per consentire cinese e arabo in URL? – BalusC

+0

E eregi è deprecato. Non una soluzione consigliata – John

2
$user_email = "[email protected]"; 

function isEmail($user) { 
    if(eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email)) { 
      return true 
    } else { 
      return false 
    } 
} 

if (isEmail($user_email)) { 
    // email is valid, run the query 
    mysql_query("UPDATE _$setprofile SET user=$sn, fc=$fc WHERE user='$user' OR user='$user_email"); 
} 
3

ho usato questa funzione per molti anni attraverso centinaia di siti. Probabilmente non è perfetto, ma non ho mai avuto una denuncia di falsi negativi (o positivi):

function validate_email($email) { 
    return (preg_match("/(@.*@)|(\.\.)|(@\.)|(\[email protected])|(^\.)/", $email) || !preg_match("/^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/", $email)) ? false : true; 
} 
2

Oltre a tutti i suggerimenti regex, che per lo più non supporta tutto della disposizione TLD (tra cui ad esempio .info e .museum) e l'imminente decisione dell'ICANN per consentire cinese e arabo nella URL (che avrebbe lasciato [a-z] e \w fallire) per le quali la seguente espressione regolare più generico è sufficiente

([^[email protected]]+)(\.[^[email protected]]+)*@([^[email protected]]+\.)+([^[email protected]]+) 

vorrei anche ricordare che facendo un WHERE user=test OR [email protected] è troppo incline agli errori. Meglio usare un PK autogenerato nella tabella e usarlo nella clausola WHERE.

Non vedo il valore di invii di posta rigidi, lunghi e illeggibili conformi alle specifiche RFCxxxx. Il modo migliore è ancora di inviare una mail con un link con una chiave di attivazione all'utente finale per farla confermare l'indirizzo mail. Informalo anche nel modulo. Se necessario, l'utente digita l'indirizzo email due volte come si fa per le password.

2

Dal momento che ognuno sta postando la loro espressione regolare, qui è mio: ^((([\w+-]+)(.[\w+-]+)*)|(\"[^(\|\")]{0,62}\"))@(([a-zA-Z0-9-]+.)+([a-zA-Z0-9]{2,})|[?([1]?\d{1,2}|2[0-4]{1}\d{1}|25[0-5]{1})(.([1]?\d{1,2}|2[0-4]{1}\d{1}|25[0-5]{1})){3}]?)$

Al meglio della mia conoscenza, supporta tutto nella specifica RFC, tra cui un sacco di cose che la maggior parte delle persone non lo fanno di solito includono.

4

Questa funzione is_email() vi darà una risposta definitiva se la stringa è un indirizzo email valido o meno. Per quanto ne so, nessuna altra soluzione lo farà con lo stesso livello di autorità.

Se ho capito bene l'esempio, si può usare in questo modo

$user = strtolower($olduser); 
$useremail = (is_email($user)) ? $user : ''; 

Il PHP funzione built-in è incompleto. Sono il principio autore di is_email() quindi sto soffia la mia tromba qui, ma ho messo un sacco di lavoro in questo in modo che nessun altro avrebbe dovuto mai più.

0
if(filter_var($email, FILTER_VALIDATE_EMAIL)) 
{ 
    echo 'This is a valid email address.'; 
    echo filter_var($email, FILTER_VALIDATE_EMAIL); 
    //exit("E-mail is not valid"); 
} 
else 
{ 
    echo 'Invalid email address.'; 
} 
2

Questo non è un ottimo metodo e non controlla se l'e-mail esiste ma controlla se sembra un'e-mail con l'estensione @ e dominio.

function checkEmail($email) { 
    if (strpos($email, '@') !== false) { 
     $split = explode('@', $email); 
     return (strpos($split['1'], '.') !== false ? true : false); 
    } 
    else { 
     return false; 
    } 
} 

$email = '[email protected]'; 
$check = checkEmail('[email protected]'); 
if ($check) { 
    echo $email . ' looks like a valid email.'; 
} 
+2

'email @ com' è un indirizzo email valido: http://en.wikipedia.org/wiki/Email_address#Valid_email_addresses – Toto

0
$user_email = "[email protected]"; 

function isEmail($email) { 
    if(eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email)) { 
      return true; 
    } else { 
      return false; 
    } 
} 

if (isEmail($user_email)) { 
    // email is ok! 
} else { 
    // email not ok 
}