1. Python / Говнокод #26001

    +1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    import re, copy, json
    
    config = {}
    
    
    def domain_mapper(domain):
    	def injector(f):
    		if domain not in config:
    			config[domain] = []
    		config[domain].append(f)
    	return injector
    
    def default(f):
    	config['default'] = [f]
    	return f
    
    @domain_mapper("gmail.com")
    @default
    def google_filter(content):
    	regex = r"([^\!\?\.]*?offer.*?[\!\?\.])"
    	repl = r""
    	return re.sub(regex, repl, content, re.M)
    
    @domain_mapper("gmail.com")
    def another_google_filter(content):
    	return content
    
    @domain_mapper("yandex.ru")
    def yandex_filter(content):
    	regex = r"<img src=[\"'](.+?)[\"'].*/>"
    	repl = r"\1"
    	return re.sub(regex, repl, content, re.M)
    
    @domain_mapper("mail.ru")
    def mail_filter(content):
    	regex = r"<img src=[\"'](.+?)\.gif[\"'].*/>"
    	repl = r"<img src='\1.png'/>"
    	return re.sub(regex, repl, content, re.M)

    Говно или нет?

    Запостил: miwomare, 28 Октября 2019

    Комментарии (85) RSS

    • class Email:

      def __init__(self, email, message):
      self.email = email
      self.message = message

      def send(self):
      for fltr in self.find_filter():
      self.message = fltr(self.message)
      return self

      def find_filter(self):
      fltr = None
      matches = re.match(r"[0-9a-zA-Z\.]+@([a-z]+\.[a-z]+)", self.email)
      if not matches: raise Exception("Invalid email addr")
      domain = matches.group(1)
      # 'default' домен не пройдет re.match
      if domain not in config: return config['default']
      return config[domain]


      def __str__(self):
      return json.dumps(self.__dict__)

      def __repr__(self):
      return str(self)
      Ответить
      • >matches = re.match(r"[0-9a-zA-Z\.]+@([a-z]+\.[a-z]+)", self.email)
        ну такое
        http://emailregex.com/
        Ответить
        • Ага. Адреса с плюсиками не пройдут (как теперь регистрировать файки?), адреса с минусом не пройдут ([email protected]), адреса на доменах с цифрами не пройдут (довольно популярные e1.ru, 163.com, mail333.com), с минусами тоже (mtu-net.ru), адреса на доменах выше второго уровня не пройдут (yahoo.co.uk), адреса на доменах с Punycode не пройдут.
          Ответить
          • показать все, что скрытоvanished
            Ответить
            • Какое же говно! Для разных языков дали неэквивалентные регулярки.

              RFC учитывает всякие устаревшие форматы, включая возможность отправить e-mail на IP-адрес (domain-literal в RFC), а ещё адрес в уголковых скобках (angle-addr), экранирование символов в local-part. Плюс ещё разные реализации ссылаются на разные версии RFC (822, 2822, 5322).
              Ответить
              • [место для шутки про парсинг адреса на языке рулов одного годного MTA]
                Ответить
                • Проще перечислить, каких символов не должно быть в адресе, чем перечислять, что можно.

                  Отбросим поддержку UUCP (цепочка маршрутизаторов почты через !), angle-addr ("Vasiliy Pupkin" <[email protected]>), отправку на айпишник (vasya-pupkin@[169.254.1.1]). Тогда адрес должен содержать ровно один символ @, которым он делится на локальную часть и доменную часть.

                  В локальной части нельзя использовать непечатаемые символы (с кодами 0x00-0x20 и 0x7F), кавычки, запятую, точку с запятой и какие-то скобочки. Всё остальное можно разрешить. Кстати, сервер вправе учитывать регистр, поэтому приводить локальную часть к нижнему регистру не надо. Хотя «Граватар» и большинство форумов всё-таки приводят, чтобы затруднить мультоводство (популярные почтовые системы регистр не учитывают).

                  Доменная часть должна подчиняться стандартам DNS: разрешены латинские буквы, цифры, минусы и точки. Домен может быть любого уровня, а не только второго. Регистр в доменной части игнорируется.

                  Остаётся открытым вопрос о символах за пределами ASCII. В доменной части они могут быть закодированы в Punycode (xn--p1ai, например), а могут быть и не закодированы. Ограничения же локальной части нужно смотреть в RFC.

                  Закидайте меня какашками, если что-то наврал.
                  Ответить
                  • Наверное, разумный подход.
                    Но я бы сделал просто .*@.+ и ниипет.
                    Ответить
                    • Поддерживаю. Единственный правильный способ валидировать и-мейл — это послать на него письмо-подтверждение.
                      Ответить
                    • Это, пожалуй, лучше, чем по ошибке отклонить валидный е-мейл.

                      Только потом при использовании (если на него нужно что-то отправлять) придётся проверить, чтобы никакой символ не сыграл роль разделителя. Ну, например, адрес вставляется в поле To:, а там запятая служит разделителем элементов списка.
                      Ответить
                      • показать все, что скрытоvanished
                        Ответить
                        • Ну, нелатинские буквы встречаются. Эффективные миллениалы уже вовсю используют домен .рф и чотакова. (а Thunderbird пока не поддерживает)

                          Тут, наверное, достаточно защиты от откровенно неподходящих вариантов, типа "", "ул. Ленина д 12", "ааа", "Иванов", "vk.com/ivanof69"...
                          Ответить
                          • Но как же тогда быть если запись на путинг за 200 руб. по почте mailto:яватный@хуйвжопе.рф?
                            Ответить
                            • Зайти через веб-интерфейс. Если и там не поддерживает, завести другой ящик.
                              Ответить
                          • показать все, что скрытоvanished
                            Ответить
                            • Зависит от того, как хорошо почтовый клиент этого "где-то" всё это поддерживает.
                              Ответить
                            • Попробовать и так, и так, оба раза поймать невнятное сообщение об ошибке, потому что где-то валидируют домен по регулярке, случайно найденной на Stackoverflow.

                              Хороший сервис должен сам сконвертировать домен в Punycode, если требуется.
                              Ответить
            • Какое же говно сайт emailregex.com! Выложили довольно годную картинку:
              http://emailregex.com/wp-content/uploads/sites/2/2014/06/General-Email-Regex-Railroad-Diagram-emailregex.com_.png

              Но не осилили написать по ней регулярку.
              Ответить
          • показать все, что скрытоvanished
            Ответить
    • Сама задача -- говно.
      Если есть на свете ад для программистов, то они там день-деньской парсят произвольный HTML регулярками
      Ответить
    • >Говно или нет?
      > import re
      Говно.

      Импорты через запятую, между функциями одна строка, индентация табами — читать PEP8, быстро, решительно!
      Ответить

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