Проверьте, является ли строка адресом электронной почты в PHP
Я пытаюсь сделать SQL-запрос, но мне нужно как-то проверить, если значение является адресом электронной почты.
Мне нужен способ проверить, если $user
- это адрес электронной почты, потому что у меня есть пользовательские значения, такие как это в моей таблице.
test
test2
test@example.com
test2@example.com
test392
test@example.net
и так далее...
мне нужно сделать так $useremail
проверки $user
найти, если это адрес электронной почты. Поэтому я могу обновить значения,WHERE user=test OR user=test@example.com
, etc.
$user = strtolower($olduser);
$useremail = "";
mysql_query("UPDATE _$setprofile SET user=$sn, fc=$fc WHERE user='$user' OR user='$useremail");
11 ответов
Это не отличный метод и не проверяет, существует ли электронное письмо, но проверяет, похоже ли оно на электронное письмо с расширением @ и домена.
function checkEmail($email) {
$find1 = strpos($email, '@');
$find2 = strpos($email, '.');
return ($find1 !== false && $find2 !== false && $find2 > $find1 ? true : false);
}
$email = 'name@email.com';
$check = checkEmail($email);
if ( $check ) {
echo $email . ' looks like a valid email.';
}
без регулярных выражений:
<?php
if(filter_var("some@address.com", FILTER_VALIDATE_EMAIL)) {
// valid address
}
else {
// invalid address
}
?>
самый простой подход-использовать регулярное выражение для проверки адреса электронной почты, хотя есть некоторые разногласия о том, как точно это может быть. Этот процесс подробно обсуждается здесь:
используя регулярное выражение для проверки адреса электронной почты
вы можете использовать REGEXP в MySQL для выбора из базы данных на основе вашего регулярного выражения:
вы можете использовать регулярные выражения для проверки входной строки, чтобы увидеть, если он совпадает с адресом электронной почты:
<?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
редактировать: для более точных выражений, пожалуйста см. Тревис ответ по этому вопросу
эта функция is_email () даст вам однозначного ответа, является ли строка допустимым адресом электронной почты или нет. Насколько я знаю, никакое другое решение не будет делать это с таким же уровнем полномочий.
Если я правильно понимаю пример, вы бы использовали его следующим образом
$user = strtolower($olduser);
$useremail = (is_email($user)) ? $user : '';
встроенная функция PHP является неполной. Я-автор принципа is_email()
Итак, я дую свою собственную трубу здесь, но я вложил много работы в это, чтобы больше никому не придется.
Я использую эту функцию в течение многих лет на сотнях сайтов. Это, вероятно, не идеально, но у меня никогда не было жалобы на ложные отрицательные (или положительные):
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;
}
$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");
}
поскольку все публикуют свое регулярное выражение, Вот мое:
^((([\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, включая множество вещей, которые большинство людей обычно не включают.
помимо всех предложений regex, которые в основном не поддерживают все доступных TLD (в том числе, например,.info
и .museum
) и предстоящее решение ICANN разрешить китайский и арабский языки в URL (что позволит [a-z]
и \w
fail), для которого достаточно следующего более общего регулярного выражения
([^.@]+)(\.[^.@]+)*@([^.@]+\.)+([^.@]+)
Я бы также упомянул, что делаю WHERE user=test OR user=test@example.com
слишком подвержен ошибкам. Лучше использовать автогенерированный ПК в таблице и использовать его в WHERE
пункт.
Я действительно не вижу значения строгих, длинных и нечитаемых mailregexes, соответствующих спецификациям RFCxxxx. Лучший способ - отправить письмо со ссылкой с ключом активации конечному пользователю, чтобы он подтвердил почтовый адрес. Сообщите об этом и в форме. При необходимости введите адрес электронной почты дважды, как вы это делаете для паролей.
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.';
}
$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
}