我正在寻找一个正则表达式,它可以匹配字符串中任何可以是有效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中返回所需的结果,但似乎跳过了一些有效的子字符串。我认为我检查不是主机名一部分的分隔符的方式可能有问题。
有什么想法吗?
发布于 2013-03-20 21:47:05
我想通了。在扫描字符串的顺序匹配时,在所需表达式之前和之后都使用分隔符意味着每对主机名之间必须包含两个字符。因此,当主机名之间只有一个字符时,将跳过第二个字符!
要获得正确的结果,只需删除前导分隔符:
/([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它只需要验证,而不是扫描。
https://stackoverflow.com/questions/15518964
复制相似问题