полностью RFC 822 совместимый regex неэффективен и неясен из-за его длины. К счастью, RFC 822 был заменен дважды, и текущая спецификация для адресов электронной почты RFC 5322 . RFC 5322 приводит к regex, который может быть понят, если изучено в течение нескольких минут и достаточно эффективен для фактического использования.
Один RFC 5322 совместимый regex может быть найден в верхней части страницы в http://emailregex.com/ , но использует шаблон IP-адреса, который плавает вокруг Интернета с ошибкой, которая позволяет 00
для любого из неподписанных десятичных значений байта в разграниченном точкой адресе, который недопустим. Остальная часть это, кажется, согласовывается с грамматикой RFC 5322 и проходит несколько тестов с помощью grep -Po
, включая доменные имена случаев, IP-адреса, плохие и имена учетной записи с и без кавычек.
Исправление 00
ошибка в шаблоне IP, мы получаем работу и довольно быстрый regex. (Очистите представленную версию, не скидку с цены, для фактического кода.)
(?: [a-z0-9! % $ # &';* + / =?^ _ '{|} ~-] + (?:\. [a-z0-9! % $ # &';* + / =?^ _ '{|} ~-] +) * | "(?: [\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f] | \\[\x01-\x09\x0b\x0c\x0e-\x7f]) *") (?: (?: [a-z0-9] (?: [a-z0-9-] * [a-z0-9])? \.) + [a-z0-9] (?: [a-z0-9-] * [a-z0-9])? | \[(?: (?: (2 (5 [0-5] | [0-4] [0-9]) |1 [0-9] [0-9] | [1-9]? [0-9])) \.) {3} (?: (2 (5 [0-5] | [0-4] [0-9]) |1 [0-9] [0-9] | [1-9]? [0-9]) | [a-z0-9-] * [a-z0-9]: (?: [\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f] | \\[\x01-\x09\x0b\x0c\x0e-\x7f]) +) \])
Вот схема конечный автомат для вышеупомянутого regexp, который более ясен, чем сам regexp
, более сложные шаблоны в Perl и PCRE (regex пользовавшаяся библиотека, например, в PHP) могут правильно синтаксический анализ RFC 5322 без помехи . Python и C# могут сделать это также, но они используют различный синтаксис от тех первых двух. Однако, если Вы вынуждены использовать один из многих менее мощных языков сопоставления с образцом, тогда it’s лучше всего для использования реального синтаксического анализатора.
также важно понять, что проверка его на RFC абсолютно ничего не говорит Вам о том, существует ли тот адрес на самом деле в предоставленном домене, или является ли человек, вводящий адрес, его истинным владельцем. Люди заключают контракт с другими под списками рассылки этот путь все время. Фиксация, которая требует более необычного вида проверки, которая включает отправку, которые обращаются к сообщению, которое включает маркер подтверждения, означала вводиться в ту же веб-страницу, как был адрес.
маркеры Подтверждения являются единственным способом знать, что Вы получили адрес человека, вводящего его. Поэтому большинство списков рассылки теперь использует тот механизм для подтверждения регистраций. В конце концов, кто-либо может подавить president@whitehouse.gov
, и это даже проанализирует как законное, но это, вероятно, не будет человек в другом конце.
Для PHP, Вы должны не , используют шаблон, данный в [1 111], Проверяют АДРЕС ЭЛЕКТРОННОЙ ПОЧТЫ с PHP, Правильный Путь , из которого я заключаю в кавычки:
существует некоторая опасность, что общее использование и широко распространенное неаккуратное кодирование установят фактический стандарт для адресов электронной почты, который более строг, чем зарегистрированный формальный стандарт.
, Который является не лучше, чем все другие шаблоны не-RFC. Это isn’t, даже достаточно умный для обработки даже RFC 822 , уже не говоря о RFC 5322. Этот , однако.
, Если Вы хотите стать необычными и педантичными, , реализуют полный механизм состояния . Регулярное выражение может только действовать как элементарный фильтр. Проблема с регулярными выражениями состоит в том, что сообщение кому-то, что их совершенно допустимый адрес электронной почты недопустим (положительная ложь), потому что Ваше регулярное выражение не может обработать его, просто грубо и невежливо с точки зрения пользователя. Механизм состояния для цели может и проверить и даже исправить адреса электронной почты, которые иначе считали бы недопустимыми, поскольку это демонтирует адрес электронной почты согласно каждому RFC. Это допускает потенциально более приятный опыт, как [1 136]
, указанный адрес электронной почты 'myemail@address,com' недопустим. Вы имели в виду 'myemail@address.com'?
См. также Адреса электронной почты Проверки , включая комментарии. Или Сравнение Адреса электронной почты, Проверяющего Регулярные выражения .
Шаблон репозитория определен довольно слабо и не обязательно имеет какое-либо отношение к шаблону агрегирования. Однако, если вы подписываетесь на способ работы с DDD, то да, репозитории уникальны для агрегатов.
Итак, давайте посмотрим на это с точки зрения DDD. DDD сообщает, что объекты внутри агрегата могут иметь ссылку на другой корень агрегата, но к объектам внутри агрегата можно получить доступ только через корень. Эмпирическое правило для определения агрегатов - то, что следует удалить при удалении корня. Однако DDD не поощряет использование отношений больше, чем большинство методологий, говоря, что только потому, что отношения существуют в домене, они не обязательно должны существовать в вашей модели домена, поэтому просто имейте это в виду.
В вашем случае, когда вы удаляете сообщение, я предполагаю, что вы также удалите комментарии, но не пользователя, создавшего сообщение, или пользователей, которые его прокомментировали. Таким образом, вы правы в определении совокупности сообщений / комментариев, но было бы бессмысленно группировать пользователей в эту совокупность.
Пользователи, будучи собственными совокупностями, могут содержать отношение ко всем своим сообщениям, потому что сообщение является совокупный корень. Вы также можете реализовать этот метод в PostRepository, чтобы получить все сообщения данного пользователя. Надеюсь, это поможет!
может содержать отношение ко всем своим сообщениям, потому что сообщение является совокупным корнем. Вы также можете реализовать этот метод в PostRepository, чтобы получить все сообщения данного пользователя. Надеюсь, это поможет! может содержать отношение ко всем своим сообщениям, потому что сообщение является совокупным корнем. Вы также можете реализовать этот метод в PostRepository, чтобы получить все сообщения данного пользователя. Надеюсь, это поможет!