Я только начал учиться кодировать как PHP, так и HTML, и взглянул на несколько руководств по регулярным выражениям, однако им трудно понять, что это значит. Я ценю любую помощь.
Например, я хотел бы подтвердить адрес электронной почты peanuts@monkey.com. Я начинаю с кода, и я получаю сообщение недействительным адресом электронной почты.
$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'; }
То, что вы написали, работает с небольшими изменениями, если это то, что вы хотите использовать, однако вы пропустите «+» в конце.
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
И, как говорят комментаторы, это регулярное выражение не идеально, но оно работает и показывает вам то, что вы забыли. Ты был недалеко!
ОБНОВЛЕНО в соответствии с запросом:
«+», «*» И «?» являются кванторами. И также является хорошим примером, где вы группируетесь.
n раз значение (неопределенно)
Причина, по которой вы используете [a-zA-Z0-9] +, не имеет «+», она будет соответствовать только одному символу. С символом + он будет соответствовать многим, но должен соответствовать хотя бы одному. С * он соответствует многим, но также и 0, и? будет соответствовать максимум 1 символу, а также 0.
Ваше регулярное выражение не соответствует адресам электронной почты. Попробуй это:
/\b[\w\.-]+@[\w\.-]+\.\w{2,4}\b/
Я рекомендую вам прочитать этот учебник, чтобы узнать о регулярных выражениях.
Кроме того, RegExr отлично подходит для тестирования.
Что касается вашего второго вопроса; символ ^
означает, что регулярное выражение должно начинаться с первого символа в введенной строке. Значение $
означает, что регулярное выражение должно заканчиваться на конечном символе в введенной строке. По сути, это означает, что ваше регулярное выражение будет соответствовать следующей строке:
но НЕ следующая строка:
Мой адрес электронной почты – 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 символа за последний период. Это будет соответствовать:
но нет:
Домен верхнего уровня (".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)) {