Проверьте, является ли строка адресом электронной почты в PHP - PullRequest
49 голосов
/ 13 ноября 2009

Я пытаюсь выполнить запрос SQL, но мне нужно как-то проверить, является ли значение адресом электронной почты. Мне нужен способ проверить, является ли $user адресом электронной почты, потому что в моей таблице есть пользовательские значения, подобные этой.

test
test2
test@example.com
test2@example.com
test392
test@example.net

и так далее ...

Мне нужно сделать так, чтобы $useremail проверял $user, чтобы выяснить, является ли это адресом электронной почты. Так что я могу обновить значения, WHERE user=test OR user=test@example.com и т. Д.

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

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

Ответы [ 11 ]

194 голосов
/ 13 ноября 2009

Без регулярных выражений:

<?php
    if(filter_var("some@address.com", FILTER_VALIDATE_EMAIL)) {
        // valid address
    }
    else {
        // invalid address
    }
?>
8 голосов
/ 13 ноября 2009

Самый простой подход - использовать регулярное выражение для проверки адресов электронной почты, хотя есть некоторые разногласия по поводу того, насколько точным это может быть. Этот процесс подробно обсуждается здесь:

Использование регулярного выражения для проверки адреса электронной почты

Вы можете использовать REGEXP в MySQL для выбора из базы данных на основе вашего регулярного выражения:

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

6 голосов
/ 07 апреля 2013
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.';
} 
5 голосов
/ 04 августа 2013

Это не очень хороший метод, он не проверяет, существует ли электронная почта, но проверяет, выглядит ли она как электронная почта с расширением @ и доменом.

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

$email = 'name@email.com';
if ( checkEmail($email) ) {
   echo $email . ' looks like a valid email address.';
}
5 голосов
/ 13 сентября 2010

Эта функция is_email () даст вам точный ответ, является ли строка действительным адресом электронной почты или нет. Насколько я знаю, никакое другое решение не сделает это с таким же уровнем полномочий.

Если я правильно понял пример, вы бы использовали его вот так

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

Встроенная функция PHP не завершена. Я принципиальный автор is_email(), поэтому здесь я выдуваю свою собственную трубу, но я вложил в это много работы, чтобы больше никому больше не пришлось.

5 голосов
/ 13 ноября 2009

Вы можете использовать регулярные выражения для проверки вашей входной строки, чтобы увидеть, соответствует ли она адресу электронной почты:

<?php 
$email = "someone@example.com"; 
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."; 
} 
?>

От: http://www.totallyphp.co.uk/code/validate_an_email_address_using_regular_expressions.htm

РЕДАКТИРОВАТЬ : для более точных выражений, пожалуйста, обратитесь к Travis answer на этот вопрос

3 голосов
/ 13 ноября 2009

Помимо всех предложений по регулярным выражениям, которые в основном не поддерживают все доступных TLD (включая, например, .info и .museum) и предстоящее решение ICANN разрешить использование китайского и арабского в URL ( который позволил бы [a-z] и \w потерпеть неудачу), для которого достаточно следующего более общего регулярного выражения

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

Я бы также упомянул, что выполнение WHERE user=test OR user=test@example.com слишком подвержено ошибкам. Лучше использовать автоматически сгенерированный PK в таблице и использовать его в предложении WHERE.

Я действительно не вижу значения строгих, длинных и нечитаемых почтовых выражений, соответствующих спецификациям RFCxxxx. Лучшим способом по-прежнему является отправка письма со ссылкой с ключом активации конечному пользователю, чтобы он мог подтвердить адрес электронной почты. Сообщите это также в форме. При необходимости позвольте пользователю ввести адрес электронной почты дважды, как вы делаете для паролей.

3 голосов
/ 13 ноября 2009

Я использую эту функцию в течение многих лет на сотнях сайтов. Это, вероятно, не идеально, но у меня никогда не было жалоб на ложные негативы (или позитивы):

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;
}
2 голосов
/ 13 ноября 2009

Поскольку все публикуют свои регулярные выражения, вот мое: ^((([\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}]?)$

Насколько мне известно, он поддерживает все в спецификации RFC, включая многие вещи, которые большинство людей обычно не включают.

2 голосов
/ 13 ноября 2009
$user_email = "email@string.com";

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");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...