Разница guish между адресом электронной почты и IRI - PullRequest
1 голос
/ 30 января 2020

У меня есть строка, которая может содержать либо адрес электронной почты, либо IRI (интернационализированный URI). Строки не содержат дополнительных окружающих пробелов или каких-либо символов переноса строк HTTP. Более того, они не содержат элементов, помеченных как «устаревшие» в соответствующих спецификациях. Мне нужен простой способ отличить guish, какие из этих вещей содержит строка.

Я смотрю на то, что я считаю последними соответствующими спецификациями: RF C 5322 § 3.4.1. Addr-Spe c Спецификация для электронной почты и RF C 3987 § 2.2. ABNF для IRI Ссылки и IRI для IRI. Я придумал следующий алгоритм с пояснениями в скобках:

  1. Если строка начинается с символа " в кавычках, это адрес электронной почты. (Адрес электронной почты local-part может быть строкой в ​​кавычках, но IRI scheme не может.)
  2. В противном случае найдите первый знак @ или двоеточие :.
    • Если встреченный символ является знаком @, строка содержит адрес электронной почты.
    • В противном случае, если это символ двоеточия :, строка содержит IRI.

Это правильный подход? Есть ли другой более простой подход? И наконец, в качестве бонуса, как бы я расширил этот алгоритм, чтобы он также отличал guish эти две вещи от IP-адреса (включая IPv4 и IPv6)?

1 Ответ

2 голосов
/ 13 марта 2020

Я думаю, что указанные правила правильные и быстрые для определения типа (электронная почта или IRI). Чтобы распространить это на IP-адреса, необходимо добавить соответствующую им грамматику: https://tools.ietf.org/html/draft-main-ipaddr-text-rep-00.

Итак, ваши правила могут быть расширены до:

Правила: (Я предположил, хорошо сформированный ввод)

  • Первый символ " => электронная почта
  • Первый символ : => IpV6 (поскольку IRI схема должна содержать хотя бы один символ)
  • Сначала : или @

    • @ => электронная почта
    • : =>

      • Если он не соответствует грамматике для IpV6 => IRI

      • В противном случае: неоднозначно, также в грамматике, некоторые параметры

        1. Использовать как IpV6 => оно будет действительным, скорее всего, именно то, что предназначено

        2. Использовать его как IRI => первая часть (до ':') будет схема, более поздняя часть которой будет представлять собой один «сегмент» в протоколе

          • Так что ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff приведет к схеме ffff и «сегменту» ffff:ffff:ffff:ffff:ffff:ffff:ffff

          • Считаю эту ситуацию маловероятной

        3. Вызывает исключение, в зависимости от среды это может быть допустимым параметром

    • Оба не в строке => IpV4

ipchar := hex / ':'
hex    := [0-9A-Fa-f]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...