Регулярные выражения. Php - поиск email

154
24 марта 2018, 17:28

Пытаюсь разобраться с регулярным выражением, которое ищет почту.

$text = 'foo foo@bar.lol bar lol baz baz@qwe.asdf qwe asdf';
if (preg_match_all('~[-a-z0-9_]+(?:\\.[-a-z0-9_]+)*@[-a-z0-9]+(?:\\.[-a-z0-9]+)*\\.[a-z]+~i', $text, $M, PREG_SET_ORDER)) {
    foreach ($M as $m) {
        echo $m[0] . PHP_EOL;
    }
}
else echo 'not found';

Но не могу понять несколько моментов:

  1. (?:\\. - одна часть экранирует точку,а первая со знаком вопроса и двоеточием?
  2. *@ - эта часть просто говорит, что до "собаки" любой символ?
  3. [-a-z0-9_]+(?:\\.[-a-z0-9_]+) - почему одна часть сгруппирована, а другая нет?
Answer 1
  1. (?:...) - незахватываемая группа. Используется что бы применить квантификатор * (0 и больше раз) к группе, отличается от обычной группировки (...) тем, что не создает ссылку и не занимается память, актуально если мы не планируем переиспользовать группу.
  2. * - это квантификатор, как написано уже в первом пункте, он относится к группе (?:\\.[-a-z0-9_]+)* и означает, что эта группа может повториться 0+ раз
  3. [-a-z0-9_]+(?:\\.[-a-z0-9_]+) - тут сложнее сказать, скорее всего из-за точки, так как перед @ должен стоять символ отличный от точки.
Answer 2
<?php
$email = "john.doe@example.com";
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
  echo("$email is a valid email address");
} else {
  echo("$email is not a valid email address");
}
?>
READ ALSO
Ошибка YII2 при ajax валидации форм

Ошибка YII2 при ajax валидации форм

Всем привет, коллеги помогите разобраться с ошибкой при валидации формы приходит ответ вместе с ошибкой , чтото связанно с ошибками но не могу...

339
Проблема с ссылками на Opencart

Проблема с ссылками на Opencart

catalog/view/theme/journal2/css/j-strapcss?j2v=2

194
Отправка данных выбранного блока в БД без перезагрузки страницы

Отправка данных выбранного блока в БД без перезагрузки страницы

Всем приветЦиклом foreach подгружаю из базы данных посты как на примере: "пост 1" "пост 2" "пост 3" и тд

191