2009-11-12 3 views
41

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

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

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

мне нужно сделать так $useremail проверки $user найти, если это адрес электронной почты. Так что я могу обновить значения, WHERE user=test OR [email protected] и т.п.

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

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

Почему это важно, если значение является адрес электронной почты? Строка может быть идеально отформатированным адресом электронной почты и все еще недействительна, например 'StackOverflowIsAGreatWebsite @ whitehouse.gov'. Таким образом, единственный способ узнать, действительно ли адрес действителен, - попытаться отправить ему письмо. И если вы не собираетесь отправлять ему письмо, почему вас это волнует? –

+0

@ Daniel Pryden Я сохранил имена пользователей в моей базе данных. Я хочу обновить значения электронной почты до обычных значений, поэтому, когда я запускаю свой скрипт, он вытаскивает данные имени пользователя из API, а затем я могу заменить старое значение электронной почты с новым значением имени пользователя. Это более удобно для сценария, который я пытаюсь написать. – Homework

ответ

162

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

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

Наконечник! NB это PHP v5.2.0 или выше только – richsage

+0

Работал безупречно. – Homework

+1

@richsage: Правильно, расширение 'filter' было включено по умолчанию с PHP 5.2.0 (выпущено 2006-11-02). Для более ранних версий PHP вы можете загрузить и установить расширение фильтра из PECL. –

8

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

Using a regular expression to validate an email address

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

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

6

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

<?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."; 
} 
?> 

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

EDIT: для получения более точных выражений, пожалуйста, обратитесь к Travis answer по этому вопросу

+2

Как насчет '.info' и' .museum' tlds? – BalusC

+1

О, также, как насчет предстоящего решения ICANN разрешить китайский и арабский языки в URL? – BalusC

+0

И ереги устарел. Не рекомендуемое решение – 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

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

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

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

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

Я хотел бы также упомянуть, что делает WHERE user=test OR [email protected] слишком подвержен ошибкам. Лучше использовать автогенерированный ПК в таблице и использовать его в предложении WHERE.

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

2

Поскольку все вывешивает их регулярное выражение, вот мое: ^((([\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, в том числе много вещей, которые большинство людей обычно не включают.

4

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

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

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

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

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

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

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» - действительный адрес электронной почты: 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 
} 
Смежные вопросы