区分电子邮件地址和IRI

问题描述 投票:0回答:1

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

我正在查看我认为是最新的相应规范:RFC 5322 § 3.4.1. Addr-Spec Specification用于电子邮件,RFC 3987 § 2.2. ABNF for IRI References and IRIs用于IRI。我提出了以下算法,并在括号中进行了说明:

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

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

uri ip-address email-address iri
1个回答
0
投票

我认为所指定的规则是正确的,可以快速确定类型(电子邮件或IRI)。要将其扩展到IP地址,应添加其相应的语法:https://tools.ietf.org/html/draft-main-ipaddr-text-rep-00

IpV4 = d8.d8.d8.d8
d8 = 0 to 255 (decimal)

IpV6 = d16:d16:d16:d16:d16:d16:(d16:d16 or Ipv4)
d16 = 0000 to ffff (hexadecimal)
with the added problem of the possibility of shortening multiple 0000 pieces into '::' (see link)

这会导致发现Ipv4与您的任何规则都不匹配。而且IpV6至少有6个冒号,最多有8个冒号:

因此,您的规则可以扩展为:

  1. 如果字符串以引号"开头,则为电子邮件地址。 (电子邮件地址local-part可能是带引号的字符串,但IRI scheme可能不是。)
  2. 否则,请找到第一个@符号或冒号:字符。
    • 如果遇到的字符是@符号,则该字符串包含电子邮件地址。
  3. 如果遇到的第一个字符是冒号:,则应匹配第一个冒号:之前的部分
    • 如果它不是有效的IpV6(因此它不是空的,或者不是长度正好为4的十六进制字符,则绝对是IRI)>
    • 否则,应计算字符串中冒号的数量
      • 6-8个冒号可以表示一个IpV6地址
        • 8个冒号只能在ipaddress以双冒号::开头或结尾时出现>
        • 仅当有1个双冒号::或无双冒号但末尾没有IpV4时才可能出现7个冒号
        • 仅当地址以IpV4地址结尾时才可能出现6个冒号
        • 如果这些计数对给定的字符串有效,则该字符串不能为IRI
    • 否则将是一个IRI,可能是一个带有方案的IRI,然后是IpV6(这种格式很难定义)
  4. 否则将是IpV4
© www.soinside.com 2019 - 2024. All rights reserved.