У меня есть эта функция для проверки адресов электронной почты:
function validateEMAIL($EMAIL) {
$v = "/[a-zA-Z0-9_-.+]+@[a-zA-Z0-9-]+.[a-zA-Z]+/";
return (bool)preg_match($v, $EMAIL);
}
Это нормально для проверки правильности адреса электронной почты?
php
regex
email
email-validation
Cameron
источник
источник
validateEmail
было бы как правдиво, так и мимоходом$email
, нет$EMAIL
.Ответы:
Самый простой и безопасный способ проверить правильность адреса электронной почты - использовать
filter_var()
функцию:Дополнительно вы можете проверить, определяет ли домен
MX
запись:Но это все еще не гарантирует, что почта существует. Единственный способ узнать это - отправить письмо с подтверждением.
Теперь, когда у вас есть простой ответ, не стесняйтесь читать о проверке адреса электронной почты, если вы хотите узнать или иначе просто использовать быстрый ответ и двигаться дальше. Никаких обид.
Попытка подтвердить адрес электронной почты с помощью регулярных выражений является «невозможной» задачей. Я бы сказал, что это регулярное выражение бесполезно. Есть три RFC относительно адресов электронной почты и написания регулярных выражений, чтобы перехватывать неправильные адреса электронной почты, и в то же время не иметь ложных срабатываний - это то, что смертный не может сделать. Проверьте этот список для тестов (как неудачных, так и успешных) регулярных выражений, используемых
filter_var()
функцией PHP .Даже встроенные функции PHP, почтовые клиенты или серверы не понимают это правильно. Все еще в большинстве случаев
filter_var
это лучший вариант.Если вы хотите узнать, какой шаблон регулярных выражений использует PHP (в настоящее время) для проверки адресов электронной почты, обратитесь к исходному тексту PHP. .
Если вы хотите узнать больше об адресах электронной почты, я предлагаю вам начать чтение спецификаций, но я должен предупредить вас, что это нелегко читать с любой натяжкой:
Обратите внимание, что
filter_var()
, как уже говорилось, доступно только с PHP 5.2. Если вы хотите, чтобы он работал с более ранними версиями PHP, вы можете использовать регулярное выражение, используемое в PHP:PS Примечание по шаблону регулярных выражений, использованному выше (из источника PHP). Похоже, на это есть авторское право Майкла Раштона . Как указано: «Не стесняйтесь использовать и распространять этот код. Но, пожалуйста, сохраните это уведомление об авторских правах».
источник
filter_var
отстают довольно долго, даже если они меняют это прямо сейчас (я опубликовал отчет об ошибках).Вы можете использовать filter_var для этого.
источник
По моему опыту,
regex
решения имеют слишком много ложных срабатываний, аfilter_var()
решения имеют ложные отрицания (особенно со всеми новыми TLD ).Вместо этого лучше убедиться, что адрес содержит все необходимые части адреса электронной почты (пользователь, символ "@" и домен), а затем убедиться, что сам домен существует.
Невозможно определить (на стороне сервера), существует ли пользователь электронной почты для внешнего домена.
Это метод, который я создал в классе Utility:
источник
stristr
не сможет получить домен, если есть несколько знаков @. Лучшеexplode('@',$email)
и проверить этоsizeof($array)==2
checkdnsrr()
и false, если в домене был знак @.Я думаю, что вам может быть лучше использовать встроенные фильтры PHP - в данном конкретном случае:
Он может возвращать истину или ложь, если поставляется с
FILTER_VALIDATE_EMAIL
параметром.источник
Это не только проверит вашу электронную почту, но и очистит ее от неожиданных символов:
источник
Ответили на это в «топ-вопросе» о проверке электронной почты https://stackoverflow.com/a/41129750/1848217
Итак, просто отметьте @, назовите пользователя на веб-интерфейс и отправьте письма с подтверждением на указанный адрес.
источник
@
, но не проверяет, действительно ли оно для любого из RFC, которые управляют электронной почтой. Это также не работает как написано. Я запустил его через regex101.com, и он не смог/^[^@]+@[^@+]$/
в/^[^@]+@[^@]+$/
filter_var
методом? Это не решает проблему принятия плохо отформатированных адресов. Ваше регулярное выражение с радостью приметjoe@domain
в качестве действительного адреса электронной почты, когда это не такfilter_var($email, FILTER_VALIDATE_EMAIL, $newOptions)
. Но у вас есть старая функция на сервере, вы не можете обновить в некоторых случаях. И вы потеряете клиентов с некоторыми новыми действительными электронными письмами. Кроме того, еще раз отмечаю, что не все серверы, обслуживающие электронную почту, работают строго в соответствии с общепринятым и современным стандартом адресов электронной почты.Если вы хотите проверить, является ли указанный домен с адреса электронной почты действительным, используйте что-то вроде:
Это удобный способ отфильтровать множество недействительных адресов электронной почты вместе со стандартной проверкой электронной почты, поскольку действительный формат электронной почты не означает действительную электронную почту .
Обратите внимание, что
idn_to_ascii()
(или его родственная функцияidn_to_utf8()
) функция может быть недоступна в вашей установке PHP, для нее требуются расширения PECL intl> = 1.0.2 и PECL idn> = 0.1.Также имейте в виду, что IPv4 или IPv6 как часть домена в электронной почте (например
user@[IPv6:2001:db8::1]
) не могут быть проверены, только именованные хосты.Подробнее здесь .
источник
Прочитав ответы здесь, я получил следующее:
источник
Если вы просто ищете фактическое регулярное выражение , что позволяет для различных точек, знаков подчеркивания и тире, это выглядит следующим образом :
[a-zA-z0-9.-]+\@[a-zA-z0-9.-]+.[a-zA-Z]+
. Это позволитtom_anderson.1-neo@my-mail_matrix.com
проверять довольно глупое письмо .источник
В настоящее время, если вы используете форму HTML5 с,
type=email
то вы уже на 80% в безопасности, так как браузерные движки имеют свой собственный валидатор. Чтобы дополнить его, добавьте это регулярное выражение в вашpreg_match_all()
и отрицайте его:Найдите регулярное выражение, используемое формами HTML5 для проверки
https://regex101.com/r/mPEKmy/1
источник