1

我正在寻找一个正则表达式,它可以匹配可以包含任何内容的字符串中任何可能是有效 RFC1123 主机名的内容。这个想法是提取可能是主机名的所有内容(通过检查子字符串是否符合所有要求为一个) - 除了最大长度为 255 个字符,这很容易在之后检查结果。

我最初想出了:

/(^|[^a-z0-9-])([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?(\.[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)*)([^a-z0-9-]|$)/i

虽然这匹配括号表达式 2 中的一些主机名(如预期的那样),但它似乎跳过了其他主机名。查看堆栈溢出问题,我发现了这个相关问题:

匹配 DNS 主机名或 IP 地址的正则表达式?

从正面反馈来看,答案应该是正确的(尽管它不验证标签大小),所以我想我会试一试。我将他们的表达式转换为类似于我之前的可提取格式:

/(^|[^a-z0-9-])((([a-z0-9]|[a-z0-9][a-z0-9-]*[a-z0-9])\.)*([a-z0-9]|[a-z0-9][a-z0-9-]*[a-z0-9]))([^a-z0-9-]|$)/i

同样,它应该在括号表达式 2 中返回所需的结果,但它似乎跳过了一些有效的子字符串。我相信我检查不属于主机名的分隔符的方式可能存在问题。

有任何想法吗?

4

1 回答 1

1

弄清楚了。在扫描字符串以查找顺序匹配时,在所需表达式之前和之后使用分隔符意味着每对主机名之间必须包含两个字符。因此,当主机名仅相差一个字符时,会跳过第二个字符!

要获得正确的结果,必须简单地删除前导分隔符:

/([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?(\.[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)*)([^a-z0-9-]|$)/i

只需要验证,不需要扫描。

于 2013-03-20T13:47:05.070 回答