Ответ 1
Без регулярных выражений:
<?php
if(filter_var("[email protected]", FILTER_VALIDATE_EMAIL)) {
// valid address
}
else {
// invalid address
}
?>
Я пытаюсь выполнить SQL-запрос, но мне нужно как-то проверить, является ли значение адресом электронной почты.
Мне нужен способ проверить, является ли $user
адресом электронной почты, потому что у меня есть пользовательские значения, такие как это в моей таблице.
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");
Без регулярных выражений:
<?php
if(filter_var("[email protected]", FILTER_VALIDATE_EMAIL)) {
// valid address
}
else {
// invalid address
}
?>
Самый простой подход - использовать регулярное выражение для проверки адресов электронной почты, хотя есть некоторые разногласия относительно того, насколько это точно. Этот процесс подробно обсуждается здесь:
Использование регулярного выражения для проверки адреса электронной почты
Вы можете использовать REGEXP в MySQL для выбора из базы данных на основе вашего регулярного выражения:
Вы можете использовать регулярные выражения для проверки своей входной строки, чтобы узнать, соответствует ли она адресу электронной почты:
<?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: для более точных выражений, пожалуйста, обратитесь к ответу Тревиса по этому вопросу
Эта функция is_email() даст вам определенный ответ на вопрос, является ли строка допустимым адресом электронной почты или нет. Насколько я знаю, никакое другое решение не сделает этого с одинаковым уровнем полномочий.
Если я правильно понимаю этот пример, вы бы использовали его как
$user = strtolower($olduser);
$useremail = (is_email($user)) ? $user : '';
Встроенная функция PHP является неполной. Я являюсь главным автором is_email()
, поэтому я дую здесь на свою собственную трубу, но я много работал над этим, чтобы никто больше не должен был когда-либо снова.
Я использую эту функцию много лет на сотнях сайтов. Это, вероятно, не идеально, но у меня никогда не было жалобы на ложные негативы (или положительные результаты):
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;
}
$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");
}
Помимо всех предложений регулярных выражений, которые в основном не поддерживают все доступного TLD (включая, например, .info
и .museum
), и предстоящее решение ICANN разрешить китайский и арабский URL (что приведет к отказу [a-z]
и \w
), для которого достаточно следующее общее регулярное выражение
([^[email protected]]+)(\.[^[email protected]]+)*@([^[email protected]]+\.)+([^[email protected]]+)
Я бы также упомянул, что выполнение WHERE user=test OR [email protected]
слишком подвержено ошибкам. Лучше использовать автогенерированный ПК в таблице и использовать его в предложении WHERE
.
Я не вижу значения строгих, длинных и нечитаемых писем, соответствующих спецификациям RFCxxxx. Лучшим способом по-прежнему является отправка почты со ссылкой с ключом активации конечному пользователю, чтобы он подтвердил адрес электронной почты. Сообщите об этом и в форме. При необходимости пусть пользователь вводит адрес электронной почты дважды, как и для паролей.
Поскольку все публикуют свое регулярное выражение, здесь мое:
^((([\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, включая многие вещи, которые обычно не включают большинство людей.
Это не отличный метод и не проверяет, существует ли почта, но он проверяет, похоже ли это на электронную почту с расширением @и домена.
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.';
}
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 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
}