如何使用正则表达式从字符串中提取RFC1123主机名?

时间:2013-03-20 08:53:13

标签: regex pcre hostname

我正在寻找一个正则表达式,它可以匹配任何可能包含任何内容的字符串中的有效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中的某些主机名匹配(按预期),但它似乎跳过其他主机名。看一下堆栈溢出问题,我发现了这个相关的问题:

Regular expression to match DNS hostname or IP Address?

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

/(^|[^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中返回所需的结果,但它似乎跳过一些有效的子字符串。我相信我检查不属于主机名的分隔符的方式可能有问题。

有什么想法吗?

1 个答案:

答案 0 :(得分: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

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

相关问题