Поскольку, очень часто приходится использовать такие шаблонные регулярные выражения, я решил сделать о них заметку, чтобы они были всегда под рукой:
Регулярное выражение для проверки корректности 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);
}
Спасибо автору!
Хоть кто-то догадался всё в одну кучу собрать, чтоб не искат по сто раз.
В закладки! :-)
Говорят, домены могут быть до 6 символов ({2,4} вместо {2,6})
ОЧЕНЬ ПОЛЕЗНЫЙ МАТЕРИАЛ ОЧЕНЬ МНЕ ПОМОГ
Если в скобки [a-z0-9_-] добавить [A-Za-z0-9_-] , то будет учитывать и заглавные буквы. Вариант только для английского алфавита.
А у вас самих на сайте какой regexp используется? Т. к. указанный мыло вида _@a_._.ru и сайт вида 8-.ru и a.ru пропускает (на сервере тестил)
С точки зрения данных регулярных выражений приведенные примеры являются корректными.
Если они не покрывают Ваши нужды, Вы можете всегда их подкорректировать.
Регулярное выражение для проверки корректности 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})$
Спасибо за существенное конструктивное замечание, испавил.
Спасибо большое, это то что я искал!
Для url у меня почему-то не срабатывает для адреса вида http://www.mail.ru/ к примеру
Не работало из-за слэша «/» в конце проверяемого адреса.
Добавил в конце регулярного выражения «(\/?)», теперь работает и с ним.
Регулярка рабочая почти во всех случаях!
Проверку имейла не проходит например такой:
support@wb-concept.com.ua
Проходит.
Перепроверьте пожалуйста:
/^([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/
подтверждение существования 6-символьных доменов: http://ru.webcams.travel/
somename@somesubdomain.travel не пройдет уже
поправьте на:
/^([a-z0-9_-]+\.)*[a-z0-9_-]+@[a-z0-9_-]+(\.[a-z0-9_-]+)*\.[a-z]{2,6}$/
понимаю, что случай редкий, однако, мало ли..
Поправил, спасибо
А как проверить, чтобы в поле для телефона не спамили иносранцы, а то пишут туда латинские буквы, а надо, чтобы поле для телефона пропускало лишь цифры, пробелы, тире и плюс в любом порядке, лишь бы латинские не пропускало и кириллицу тоже. Спасибо.
Подумал сам, и вот примерно так:
^[+]{0,1}[- (),0-9]{7,}$
Спасибо долго искал качественные регулярные выражения
Ругелярка для URL, работает только для разбора домена.
Если например нужно разобрать путь к картинке http://yandex.st/morda-logo/i/logo.png
то лучше:
^(https?|ftp)\:\/\/[a-zA-Z0-9\.\-]+\.[a-z]{2,}(\/.+)$
(лишние «карманы» почистил)
Лучше вот так
$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);
Спасибо за статью!
не лучше ли (\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,6}) для email
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
и т.д.
абсолютно реальные адреса
Данные регулярные выражения для проверки почты не актуальны, т.к. не учитывают русскоязычные домены.
http://habrahabr.ru/post/175375/
Номер телефона — код страны у Вас обязательно 2 символа. На самом деле может быть от 1 до 4. Например через Ваш шаблон не пройдет код России +7 и Украины +380.
Всё-же для URL, наверное, будет лучше
^((https?|ftp)\:\/\/)?([a-z0-9]{1})((\.[a-z0-9-])|([a-z0-9-]))*([a-z0-9]{1})\.([a-z]{2,6})(\/?)$
а то пропускает ссылки типа mail-.ru
В конечном счёте пришёл к такому регулярному выражению для проверки корректности 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.
Во первых. Кириллические домены НЕ РАБОТАЮТ!
Во вторых. 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. Без обид!
Перебрал разные фукции и схемы выражений для проверки мейл, это лучшее
Только не понятно, почему автор считает мейлы типа 8-.ru и a.ru корректными. Нет таких доменов.
Как поправить код лично для меня. Прошу.
Не понятно, почему выражение пропускает такие формы и домены.
Можно ли поправить код под именно такие формы лично для меня. Очень прошу, для меня это важно.. в моем случае.
john@-doe.com / нет такого домена -doe
12@8-.ru / нет такого домена 8-
12@a.ru / нет доменов с одной буквой
12@1.ru / нет цифровых доменов
([A-zА-я])+([0-9\-_\+\.])*([A-zА-я0-9\-_\+\.])*@([A-zА-я])+([0-9\-_\+\.])*([A-zА-я0-9\-_\+\.])*[\.]([A-zА-я])+
>>> Роман:
>>>… 12@a.ru / нет доменов с одной буквой
https://www.nic.ru/catalog/domains/?searchWord=a — домены с одной буквой есть
>>>12@1.ru
Аналогично: https://www.nic.ru/catalog/domains/?searchWord=1 — цифровые домены бывают.
Предусмотреть недоступность конкретной комбинации имени и домена верхнего уровня с помощью регулярного выражения невозможно.
Упомянутая выше статья https://habr.com/ru/post/175375/ в помощь!