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

409

有没有一个正则表达式能匹配任何合法的DNS主机名或IP地址?

编写一个能够在95%的情况下工作的正则表达式很容易,但我希望得到一个经过充分测试以精确匹配最新RFC规范的DNS主机名的表达式。


1
请注意:可以确定一个字符串是否是有效的IPv4地址或有效的主机名,但不能确定一个字符串既是有效的IPv4地址又是有效的主机名。原因是:任何匹配为有效IPv4地址的字符串也可能是有效的主机名,可以通过DNS服务器解析为不同的IP地址。 - ndsvw
22个回答

-2

检查主机名,例如... mywebsite.co.in、thangaraj.name、18thangaraj.in、thangaraj106.in 等等。

[a-z\d+].*?\\.\w{2,4}$

3
OP要求的是与最新的RFC规范完全匹配的东西,但这并不适用于例如*.museum,而它将与*.foo匹配。以下是有效TLD的列表链接:http://data.iana.org/TLD/tlds-alpha-by-domain.txt - bdesham
我不确定将加号放在字符类(方括号)内是一个好主意,而且还有带有5个字母的顶级域名(例如 .expert)。 - Yaron
最佳完成RFC的方法是使用系统/语言函数。 inet_aton已经足够好了。 - m3nda

-2
我考虑了这个简单的正则表达式匹配模式,用于IP地址匹配 \d+[.]\d+[.]\d+[.]\d+


1111.1.1.1 不是有效的 IP。如果不考虑子网,实际上没有办法真正测试 IP 格式。你至少应该注意出现次数,使用类似于 ^\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3} 的东西,当然这并不是正确的方法。如果你有一种编写脚本的语言,那么肯定能够访问它的网络功能。检查真实 IP 的最佳方式是告诉系统将一个 IP 转换为其正确格式,然后检查 true/false。在 Python 中,我使用 socket.inet_aton(ip)。在 PHP 中,您需要使用 inet_aton($ip) - m3nda
Python用户可以在这里查看:https://gist.github.com/erm3nda/f25439bba66931d3ca9699b2816e796c - m3nda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接