我正在寻找一个正则表达式,它可以匹配可以包含任何内容的字符串中任何可能是有效 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 中的一些主机名(如预期的那样),但它似乎跳过了其他主机名。查看堆栈溢出问题,我发现了这个相关问题:
从正面反馈来看,答案应该是正确的(尽管它不验证标签大小),所以我想我会试一试。我将他们的表达式转换为类似于我之前的可提取格式:
/(^|[^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 中返回所需的结果,但它似乎跳过了一些有效的子字符串。我相信我检查不属于主机名的分隔符的方式可能存在问题。
有任何想法吗?