我正在做一个项目。net,可以连接到不同的机器由一个IP地址,用户输入。
我正在尝试使用正则表达式验证输入的IP地址。我已经在互联网上搜索了一段时间了,我不能得到一个正确的正则表达式。
我写了一个小程序来测试正则表达式,参见here,(IP地址是随机生成的,如果其中一些IP地址属于某人,我很抱歉)
你能帮我找到一个可行的解决方案,在客户端验证用户输入?!(它可以是IPv4,IPv6或主机名,端口不包括在地址中)
谢谢。
我正在做一个项目。net,可以连接到不同的机器由一个IP地址,用户输入。
我正在尝试使用正则表达式验证输入的IP地址。我已经在互联网上搜索了一段时间了,我不能得到一个正确的正则表达式。
我写了一个小程序来测试正则表达式,参见here,(IP地址是随机生成的,如果其中一些IP地址属于某人,我很抱歉)
你能帮我找到一个可行的解决方案,在客户端验证用户输入?!(它可以是IPv4,IPv6或主机名,端口不包括在地址中)
谢谢。
4条答案
按热度按时间0dxa2lsx1#
我设法把一个正则表达式,匹配IPv6,IPv4和主机名,我能想到的,不幸的是,似乎是无效的IP地址是有效的主机名,在某些情况下,但我想这是确定的。
下面是正则表达式:)测试程序可以找到here
另见:
Regular expression to match DNS hostname or IP Address?
RFC 1123
IPv6 Validator
44u64gxh2#
我搞定了http://jsfiddle.net/AJEzQ/
puruo6ea3#
在node.js中,你可以使用内置的模块
net
,它有net.isIP(ip)
,net.isIPv4(ip)
和net.isIPv6(ip)
。https://nodejs.org/api/net.html
zzlelutf4#
编程构造验证正则表达式
在强大的库
ippaddr.js
[2]中可以找到:https://github.com/whitequark/ipaddr.js/blob/8c18488416e20f2d624ab6f727638673018a2a46/lib/ipaddr.js#L6-L30
一个全面的JS清单-(与旧答案的RegEx战场相反:)-以模块化的方式编程构造正则表达式。
这样可以将这些正则表达式的复杂性分解为更容易掌握的基本部分。它还可以保存代码大小:)
注意:这是用于验证 * 仅 * IP地址版本4和6(不是主机名或其他URI RFC相关的东西):
简单性的代价,需要更多的解析逻辑
reg-ex部分的这种整洁是有代价的,所需的解析逻辑更加“分叉”:)
请在此处检查相应的解析方法:
IPv4.parser
:https://github.com/whitequark/ipaddr.js/blob/8c18488416e20f2d624ab6f727638673018a2a46/lib/ipaddr.js#L405IPv6.parser
:https://github.com/whitequark/ipaddr.js/blob/8c18488416e20f2d624ab6f727638673018a2a46/lib/ipaddr.js#L799充分条件vs必要条件
正则表达式与上面的解析逻辑相结合,通过 sufficient 条件来匹配任何一种地址类型的Assert(就像前面答案的mega-regex上的直接匹配一样)。
OTOH对于每种地址类型都有许多 * 必要 * 条件。我们可以使用这些条件来Assert相反的情况(即输入 * 不是 * 任何一种类型):检查缺少的
:
字符是Assert地址肯定是 * 不是 * IP v6的一种方法。当想要以最佳方式简单地区分(即分类)输入时,这可以派上用场。首先,在不包含冒号的输入上运行整个IPv6-regex将是一种开销。同样值得注意的是,上述库在进行IPv6验证时也实现了充分条件与必要条件之间的差异(或者特别是打算区分两种地址类型的输入)[1]:
使用
ipaddr.js
区分v4和v6:[1] https://github.com/whitequark/ipaddr.js/blob/master/lib/ipaddr.js#L750-L765 [2] https://www.npmjs.com/package/ipaddr.js