Регулярные выражения для проверки e-mail, URL и номера телефона

2011-01-31

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

Регулярное выражение для проверки корректности e-mail
(пример: «nick@mail.com»):

^([a-z0-9_-]+\.)*[a-z0-9_-]+@[a-z0-9_-]+(\.[a-z0-9_-]+)*\.[a-z]{2,6}$

Регулярное выражение для проверки корректности URL
(пример: «http://www.my-site.com»):

^((https?|ftp)\:\/\/)?([a-z0-9]{1})((\.[a-z0-9-])|([a-z0-9-]))*\.([a-z]{2,6})(\/?)$

Регулярное выражение для проверки корректности номера телефона
(пример: «+38(044)555-55-55»):

^\+\d{2}\(\d{3}\)\d{3}-\d{2}-\d{2}$

Пример использования на JavaScript:

function isValidPhone(myPhone) {
return /^\+\d{2}\(\d{3}\)\d{3}-\d{2}-\d{2}$/.test(myPhone);
}



30 комментариев на «Регулярные выражения для проверки e-mail, URL и номера телефона»

  1. IL82:

    Спасибо автору!
    Хоть кто-то догадался всё в одну кучу собрать, чтоб не искат по сто раз.
    В закладки! :-)

  2. Илья:

    Говорят, домены могут быть до 6 символов ({2,4} вместо {2,6})

  3. ОЧЕНЬ ПОЛЕЗНЫЙ МАТЕРИАЛ ОЧЕНЬ МНЕ ПОМОГ

  4. Игорь:

    Если в скобки [a-z0-9_-] добавить [A-Za-z0-9_-] , то будет учитывать и заглавные буквы. Вариант только для английского алфавита.

  5. А у вас самих на сайте какой regexp используется? Т. к. указанный мыло вида _@a_._.ru и сайт вида 8-.ru и a.ru пропускает (на сервере тестил)

  6. admin:

    С точки зрения данных регулярных выражений приведенные примеры являются корректными.
    Если они не покрывают Ваши нужды, Вы можете всегда их подкорректировать.

  7. Алекс:

    Регулярное выражение для проверки корректности URL допускает варианты http://www.my-site………………………………….com
    Для исключения этих вариантов необходимо вместо ([a-z0-9-.]*) написать ((\.[a-z0-9-])|([a-z0-9-]))* т.е точка + любой символ из набора либо любой символ из набора.

    ^((https?|ftp)\:\/\/)?([a-z0-9]{1})((\.[a-z0-9-])|([a-z0-9-]))*\.([a-z]{2,4})$

  8. admin:

    Спасибо за существенное конструктивное замечание, испавил.

  9. Дмитрий:

    Спасибо большое, это то что я искал!

  10. Рустам:

    Для url у меня почему-то не срабатывает для адреса вида http://www.mail.ru/ к примеру

  11. admin:

    Не работало из-за слэша «/» в конце проверяемого адреса.
    Добавил в конце регулярного выражения «(\/?)», теперь работает и с ним.

  12. xxx:

    Регулярка рабочая почти во всех случаях!

  13. Константин:

    Проверку имейла не проходит например такой:
    support@wb-concept.com.ua

  14. admin:

    Проходит.
    Перепроверьте пожалуйста:
    /^([a-z0-9_-]+\.)*[a-z0-9_-]+@[a-z0-9_-]+(\.[a-z0-9_-]+)*\.[a-z]{2,4}$/.test(«support@wb-concept.com.ua»)
    // true

    Пример тут:
    http://jsfiddle.net/nickproger/JzKz7/

  15. pptp:

    подтверждение существования 6-символьных доменов: http://ru.webcams.travel/
    somename@somesubdomain.travel не пройдет уже
    поправьте на:
    /^([a-z0-9_-]+\.)*[a-z0-9_-]+@[a-z0-9_-]+(\.[a-z0-9_-]+)*\.[a-z]{2,6}$/
    понимаю, что случай редкий, однако, мало ли..

  16. admin:

    Поправил, спасибо

  17. Владислав:

    А как проверить, чтобы в поле для телефона не спамили иносранцы, а то пишут туда латинские буквы, а надо, чтобы поле для телефона пропускало лишь цифры, пробелы, тире и плюс в любом порядке, лишь бы латинские не пропускало и кириллицу тоже. Спасибо.

  18. Владислав:

    Подумал сам, и вот примерно так:
    ^[+]{0,1}[- (),0-9]{7,}$

  19. Спасибо долго искал качественные регулярные выражения

  20. Ругелярка для URL, работает только для разбора домена.
    Если например нужно разобрать путь к картинке http://yandex.st/morda-logo/i/logo.png
    то лучше:
    ^(https?|ftp)\:\/\/[a-zA-Z0-9\.\-]+\.[a-z]{2,}(\/.+)$
    (лишние «карманы» почистил)

  21. Лучше вот так
    $url = ‘http://www.koder.cn.ms/wp-content/uploads/2013/01/ww.png’;
    preg_match(‘#^(https?|ftp)\:\/\/(www\.)?([a-zA-Z0-9\.\-]+\.[a-z]{2,})(\/.+)$#’, $url, $match);

  22. Спасибо за статью!

  23. Max:

    не лучше ли (\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,6}) для email

  24. Vitaliy:

    Max : » не лучше ли (\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,6}) для email »

    нет не лучше. примеры которые ваш шаблон не пропускает

    info@sib-tech.ru
    info@7mail.ru
    info-info@mail.ru
    info.info@mail.ru
    info@sib.tech.ru

    и т.д.
    абсолютно реальные адреса

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

  26. Вячеслав:

    Номер телефона — код страны у Вас обязательно 2 символа. На самом деле может быть от 1 до 4. Например через Ваш шаблон не пройдет код России +7 и Украины +380.

  27. Сергей:

    Всё-же для URL, наверное, будет лучше
    ^((https?|ftp)\:\/\/)?([a-z0-9]{1})((\.[a-z0-9-])|([a-z0-9-]))*([a-z0-9]{1})\.([a-z]{2,6})(\/?)$
    а то пропускает ссылки типа mail-.ru

  28. Сергей:

    В конечном счёте пришёл к такому регулярному выражению для проверки корректности URL (если используются только латинские буквы):
    ^((https?|ftp)\:\/\/)?([a-z0-9]+([-]*[a-z0-9]*)*[a-z0-9]+)(\.[a-z0-9]+([-]*[a-z0-9]*)*[a-z0-9]+)*\.([a-z]{2,6})(\/?)$
    Из требований, предъявляемых к собственному обозначению доменных имён:
    1) содержать не менее двух символов;
    2) содержать не более 63 символов;
    3) начинаться и заканчиваться буквой или цифрой;
    4) не содержать символов, отличных от букв, цифр и дефиса (допустимыми буквами
    являются буквы латинского алфавита; прописные и строчные буквы не
    различаются);
    5) не содержать одновременно дефисы в 3-й и 4-й позициях

    реализована проверка корректности собственного обозначения доменного имени любого уровня для пунктов 1,3,4
    и не реализована для пунктов 2 и 5.

  29. Andrey:

    Во первых. Кириллические домены НЕ РАБОТАЮТ!
    Во вторых. Email адреса и урлы с кодировкой Unicode (UTF-16) не екранированные ни прямые не пропускает, актуально для (URL) Wiki-pages.
    В третьих. Вполне себе валидный Email «Look at all these spaces!»@example.com — не пропустит, хотя в RFC допускается использование любых Unicode символов, если экранировать кавычками.

    А вообще, автору и всем кто пытается найти регулярки для Email’ов стоит немного напрячь свои мозги, если есть, что напрягать и немного погуглить. https://habr.com/ru/post/175375/ (русскоязычная статья) https://davidcel.is/posts/stop-validating-email-addresses-with-regex/ (англоязычный оригинал). Для телефонов вообще — проблема, поскольку допускается возможность различных разделителей («-«, » «, «(«, «)», etc.) и латинский алфавит.

    class User EmailAddressValidator
    end

    class EmailValidator < ActiveModel::Validator
    EMAIL_ADDRESS_QTEXT = Regexp.new '[^\\x0d\\x22\\x5c\\x80-\\xff]', nil, 'n'
    EMAIL_ADDRESS_DTEXT = Regexp.new '[^\\x0d\\x5b-\\x5d\\x80-\\xff]', nil, 'n'
    EMAIL_ADDRESS_ATOM = Regexp.new '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+', nil, 'n'
    EMAIL_ADDRESS_QUOTED_PAIR = Regexp.new '\\x5c[\\x00-\\x7f]', nil, 'n'
    EMAIL_ADDRESS_DOMAIN_LITERAL = Regexp.new "\\x5b(?:#{EMAIL_ADDRESS_DTEXT}|#{EMAIL_ADDRESS_QUOTED_PAIR})*\\x5d", nil, 'n'
    EMAIL_ADDRESS_QUOTED_STRING = Regexp.new "\\x22(?:#{EMAIL_ADDRESS_QTEXT}|#{EMAIL_ADDRESS_QUOTED_PAIR})*\\x22", nil, 'n'
    EMAIL_ADDRESS_DOMAIN_REF = EMAIL_ADDRESS_ATOM
    EMAIL_ADDRESS_SUB_DOMAIN = "(?:#{EMAIL_ADDRESS_DOMAIN_REF}|#{EMAIL_ADDRESS_DOMAIN_LITERAL})"
    EMAIL_ADDRESS_WORD = "(?:#{EMAIL_ADDRESS_ATOM}|#{EMAIL_ADDRESS_QUOTED_STRING})"
    EMAIL_ADDRESS_DOMAIN = "#{EMAIL_ADDRESS_SUB_DOMAIN}(?:\\x2e#{EMAIL_ADDRESS_SUB_DOMAIN})*"
    EMAIL_ADDRESS_LOCAL_PART = "#{EMAIL_ADDRESS_WORD}(?:\\x2e#{EMAIL_ADDRESS_WORD})*"
    EMAIL_ADDRESS_SPEC = "#{EMAIL_ADDRESS_LOCAL_PART}\\x40#{EMAIL_ADDRESS_DOMAIN}"
    EMAIL_ADDRESS_PATTERN = Regexp.new "#{EMAIL_ADDRESS_SPEC}", nil, 'n'
    EMAIL_ADDRESS_EXACT_PATTERN = Regexp.new "\\A#{EMAIL_ADDRESS_SPEC}\\z", nil, 'n'

    def validate(record)
    unless record.email =~ EMAIL_ADDRESS_EXACT_PATTERN
    record.errors[:email] << 'is invalid'
    end
    end
    end

    Это для тех, кому лень в поиск вбивать запросы типа "email+regex". Ужасающе, но это не самые страшные :)

    P.S. Без обид!

Добавить комментарий