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

Artn

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

$text = 'foo [removed_email] bar lol baz [removed_email]f 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_]+) - почему одна часть сгруппирована, а другая нет?
1 ответ

Artn

  1. (?:...) - незахватываемая группа. Используется что бы применить квантификатор * (0 и больше раз) к группе, отличается от обычной группировки (...) тем, что не создает ссылку и не занимается память, актуально если мы не планируем переиспользовать группу.
  2. * - это квантификатор, как написано уже в первом пункте, он относится к группе (?:\\.[-a-z0-9_]+)* и означает, что эта группа может повториться 0+ раз
  3. [-a-z0-9_]+(?:\\.[-a-z0-9_]+) - тут сложнее сказать, скорее всего из-за точки, так как перед @ должен стоять символ отличный от точки.

licensed under cc by-sa 3.0 with attribution.