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

Я только начал учиться кодировать как PHP, так и HTML, и взглянул на несколько руководств по регулярным выражениям, однако им трудно понять, что это значит. Я ценю любую помощь.

Например, я хотел бы подтвердить адрес электронной почты peanuts@monkey.com. Я начинаю с кода, и я получаю сообщение недействительным адресом электронной почты.

  1. Что я делаю не так?
  2. Я знаю, что метасимволы, такие как ^, обозначают начало строки, а $ обозначают конец строки, но что это значит? Что такое начало строки и какой конец строки?
  3. Когда я группирую регулярные выражения?

$emailaddress = 'peanuts@monkey.com'; if(preg_match('/^[a-zA-z0-9]+@[a-zA-z0-9]+\.[a-zA-z0-9]$/', $emailaddress)) { echo 'Great, you have a valid email address'; } else { echo 'boo hoo, you have an invalid email address'; } 

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

То, что вы написали, работает с небольшими изменениями, если это то, что вы хотите использовать, однако вы пропустите «+» в конце.

1)

  ^[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z0-9]+$ 

2)

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

Blah blah blah someEmail@email.com blah blah

не даст вам совпадения, потому что у вас нет адреса электронной почты в начале строки, и строка не заканчивается вместе с ним, чтобы в соответствии с этим в этом контексте вам пришлось бы отбрасывать ^ и $.

3) Группировка используется по двум причинам, насколько мне известно: обратная ссылка и … группировка. Группировка используется по тем же причинам, что и в математике, 1 + 3 * 4 – это не то же самое (1 + 3) * 4. Вы используете скобки для ограничения кванторов, таких как «+», «*» и «?». а также чередование '|' и т.п.

Вы также скобки для обратного ссылок, но поскольку я не могу объяснить это лучше, я бы связал вас с: http://www.regular-expressions.info/brackets.html

Я попрошу вас взглянуть на эту книгу, хотя вы только читаете первые 2-3 главы, которые вы узнаете много, и это отличная книга! http://oreilly.com/catalog/9781565922570


И, как говорят комментаторы, это регулярное выражение не идеально, но оно работает и показывает вам то, что вы забыли. Ты был недалеко!


ОБНОВЛЕНО в соответствии с запросом:

«+», «*» И «?» являются кванторами. И также является хорошим примером, где вы группируетесь.

  • «+» означает совпадение с тем, какой хакерчик предшествует ему или группе 1 или n раз.
  • '*' означает совпадение с тем, что charachter предшествует ему 0 или n раз.
  • '?' означает, что любой хакерчик предшествует ему или группе 0 или 1 раз.

n раз значение (неопределенно)

Причина, по которой вы используете [a-zA-Z0-9] +, не имеет «+», она будет соответствовать только одному символу. С символом + он будет соответствовать многим, но должен соответствовать хотя бы одному. С * он соответствует многим, но также и 0, и? будет соответствовать максимум 1 символу, а также 0.

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

 /\b[\w\.-]+@[\w\.-]+\.\w{2,4}\b/ 

Я рекомендую вам прочитать этот учебник, чтобы узнать о регулярных выражениях.

Кроме того, RegExr отлично подходит для тестирования.

Что касается вашего второго вопроса; символ ^ означает, что регулярное выражение должно начинаться с первого символа в введенной строке. Значение $ означает, что регулярное выражение должно заканчиваться на конечном символе в введенной строке. По сути, это означает, что ваше регулярное выражение будет соответствовать следующей строке:

peanuts@monkey.com

но НЕ следующая строка:

Мой адрес электронной почты – peanuts@monkey.com, и мне это нравится!

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


Как указывает CanSpice, сопоставление всех возможных адресов электронной почты не так просто. Использование выражения RFC2822 Email Validation будет работать лучше:

 /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/ 

Есть много альтернатив, но даже самые простые из них будут выполнять справедливую работу, так как большинство адресов электронной почты заканчиваются на .com (или на других доменах с 2-4 символами).


Единственная причина, по которой ваше оригинальное выражение не работает, заключается в том, что вы ограничиваете количество символов за период (.) В ваших выражениях до 1. Изменение выражения:

 /^[a-zA-z0-9]+@[a-zA-z0-9]+\.[a-zA-z0-9]+$/ 

Позволит бесконечное количество символов за последний период.

 /^[a-zA-z0-9]+@[a-zA-z0-9]+\.[a-zA-z0-9]{2,4}$/ 

Допустим 2-4 символа за последний период. Это будет соответствовать:

name@email.com

name@email.info

но нет:

fake@address.suckers

Домен верхнего уровня (".com", ".net", ".museum") может содержать от 2 до 6 символов. Поэтому вы должны сказать 2,6 вместо 2,4.

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

^ \ w + ([- + ._] \ w +) @ (\ w + ((- +) |.)) \ w {1,63}. [a-zA-Z] {2,6} $

В этом много исследований. Но у меня есть несколько основных советов:

НЕ ТОЛЬКО КОПИРОВАЛЬНАЯ ПАСТ! Если кто-то говорит: «Вот для этого отличное регулярное выражение», не просто скопируйте его! Поймите, что происходит! Регулярные выражения не так уж трудны. И как только вы выучите их хорошо, они будут выплачивать дивиденды навсегда. Я получил от них хороший опыт, взяв класс в Perl в колледже. С тех пор я едва улучшился, и я лучше, чем подавляющее большинство программистов, которых я знаю. Грустно. В любом случае, изучите это!

Начните с малого. Вместо того, чтобы создавать гигантское регулярное выражение и тестировать его, когда вы закончите, проверьте только несколько символов. Например, при написании проверки подлинности электронной почты почему бы не попробовать \ w + @ \ w +. \ W + и посмотреть, насколько это хорошо? Добавьте еще несколько вещей и повторите проверку. Как ^ \ w + @ \ w +. [A-Za-z] {2,6} $

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

 /^[a-zA-Z_0-9]+@[a-zA-Z0-9]+\.[a-zA-z0-9]{2,4}$/ 

{2,4} говорит, что домен верхнего уровня находится между 2 и 4 символами.

Это подтвердит любой адрес электронной почты (по крайней мере, я пробовал много)

preg_match("/^[a-z0-9._-]{2,}+\@[a-z0-9_-]{2,}+\.([a-z0-9-]{2,4}|[a-z0-9-]{2,}+\.[a-z0-9-]{2,4})$/i", $emailaddress);

Надеюсь, что это работает!

Убедитесь, что вы ВСЕГДА избегаете метасимволов (например, точки):

 if(preg_match('/^[a-zA-z0-9]+@[a-zA-z0-9]+\.[a-zA-z0-9]$/', $emailaddress)) {