1

我有一个可以包含电子邮件地址或 IRI(国际化 URI)的字符串。字符串不包含额外的环绕空格或任何 HTTP 换行字符。此外,它们不包含在其相应规范中标记为“过时”的任何元素。我需要一种简单的方法来区分字符串包含哪些内容。

我正在查看我认为是最新的相应规范:RFC 5322 § 3.4.1。电子邮件的 Addr-Spec 规范RFC 3987 § 2.2。用于 IRI 参考的 ABNF 和用于 IRI 的 IRI。我提出了以下算法,括号内有解释:

  1. 如果字符串以引号"字符开头,则它是电子邮件地址。(电子邮件地址local-part可能是带引号的字符串,但 IRIscheme可能不是。)
  2. 否则查找第一个 at@符号或冒号:字符。
    • 如果遇到的字符是 at@符号,则字符串包含电子邮件地址。
    • 否则,如果它是一个冒号:字符,则该字符串包含一个 IRI。

这种方法正确吗?还有另一种更简单的方法吗?最后作为奖励,我将如何扩展此算法以将这两件事与 IP 地址(包括 IPv4 和 IPv6)区分开来?

4

1 回答 1

2

我认为指定的规则是正确且快速确定类型(电子邮件或 IRI)。要将其扩展到 IP 地址,应添加相应的语法:https ://datatracker.ietf.org/doc/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]
于 2020-03-13T12:41:32.607 回答