Sprawdź, czy ciąg znaków jest adresem e-mail w PHP

Próbuję wykonać zapytanie SQL, ale muszę jakoś sprawdzić, czy wartością jest adres e-mail. Potrzebuję sposobu, aby sprawdzić, czy {[2] } jest adresem e-mail, ponieważ mam wartości użytkownika, takie jak ta w mojej tabeli.

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

I tak dalej...

Muszę to zrobić tak $useremail sprawdza $user, aby znaleźć, czy to adres e-mail. Więc mogę zaktualizować wartości, WHERE user=test OR [email protected], itp.

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

mysql_query("UPDATE _$setprofile SET user=$sn, fc=$fc WHERE user='$user' OR user='$useremail");
Author: Andy Lester, 2009-11-13

11 answers

Nie jest to świetna metoda i nie sprawdza, czy e-mail istnieje, ale sprawdza, czy wygląda jak e-mail z rozszerzeniem @ i domeny.

function checkEmail($email) {
   $find1 = strpos($email, '@');
   $find2 = strpos($email, '.');
   return ($find1 !== false && $find2 !== false && $find2 > $find1 ? true : false);
}

$email = '[email protected]';
$check = checkEmail($email);
if ( $check ) {
   echo $email . ' looks like a valid email.';
}
 5
Author: Jake,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-25 20:55:35

Bez wyrażeń regularnych:

<?php
    if(filter_var("[email protected]", FILTER_VALIDATE_EMAIL)) {
        // valid address
    }
    else {
        // invalid address
    }
?>
 176
Author: Uri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-12 22:45:41

Najprostszym podejściem jest użycie wyrażenia regularnego do sprawdzania adresów e-mail, chociaż istnieje pewna rozbieżność co do tego, jak dokładne może to być. Proces ten jest szczegółowo omówiony tutaj:

Używanie wyrażenia regularnego do weryfikacji adresu e-mail

Możesz użyć wyrażenia regularnego w MySQL, aby wybrać z bazy danych na podstawie wyrażenia regularnego:

Http://dev.mysql.com/doc/refman/5.1/en/regexp.html

 8
Author: Travis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:03:08

Możesz użyć wyrażeń regularnych, aby zweryfikować swój łańcuch wejściowy, aby sprawdzić, czy pasuje do adresu 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."; 
} 
?>

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

EDIT : aby uzyskać dokładniejsze wyrażenia, zapoznaj się z Travis answer na to pytanie

 5
Author: Rubens Farias,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:26

Ta funkcja is_email () da Ci konkretną odpowiedź, czy łańcuch jest prawidłowym adresem e-mail, czy nie. O ile mi wiadomo, żadne inne rozwiązanie nie zrobi tego z takim samym poziomem uprawnień.

Jeśli dobrze rozumiem przykład, użyłbyś go w ten sposób

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

Wbudowana funkcja PHP jest niekompletna. Jestem głównym autorem is_email(), więc dmucham tutaj na własną trąbkę, ale włożyłem w to wiele pracy, aby nikt inny nie musiał nigdy więcej.

 4
Author: Dominic Sayers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-21 17:46:02

Używam tej funkcji od wielu lat na setkach witryn. Prawdopodobnie nie jest idealny, ale nigdy nie miałem skargi na fałszywe negatywy (lub pozytywy): {]}

function validate_email($email) {
    return (preg_match("/(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/", $email) || !preg_match("/^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/", $email)) ? false : true;
}
 3
Author: Rob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-12 22:49:16
$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");
}
 2
Author: iamkoa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-12 22:46:15

Ponieważ każdy zamieszcza swoje Wyrażenie regularne, oto moje: ^((([\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}]?)$

Zgodnie z moją najlepszą wiedzą, obsługuje wszystko w specyfikacji RFC, w tym wiele rzeczy, których większość ludzi zwykle nie zawiera.

 2
Author: Scott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-12 22:54:58

Oprócz wszystkich sugestii regex, które w większości nie obsługują wszystkich dostępnych TLD (w tym na przykład .info i .museum) oraz nadchodzącej decyzji ICANN o zezwoleniu na Chiński i arabski w adresach URL (które pozwoliłyby [a-z] i \w zawieść), dla których następujące bardziej ogólne regex jest wystarczające

([^.@]+)(\.[^.@]+)*@([^.@]+\.)+([^.@]+)
Chciałbym również wspomnieć, że robienie WHERE user=test OR [email protected] jest zbyt podatne na błędy. Lepiej użyć autogenerowanego PK w tabeli i użyć go w klauzuli WHERE.

I don ' t really see wartość strict, long i unreadable mailregexes zgodna ze specyfikacją RFCxxxx. Najlepszym sposobem jest wysłanie wiadomości z linkiem z kluczem aktywacyjnym do użytkownika końcowego, aby potwierdzić adres e-mail. Poinformuj o tym również w formularzu. Jeśli to konieczne, pozwól użytkownikowi wpisać adres e-mail dwa razy, tak jak w przypadku haseł.

 2
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-12 23:06:38
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
Author: Ben,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-07 13:03:24
$user_email = "email@gmailcom";

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
}
 0
Author: Douglas Evaristo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-23 19:40:17