如何评估一个IP?

9

如何确定一个字符串是IP地址?无论是IPv4还是IPv6?

最少和最多需要多少个字符?

我认为这应该是一个正则表达式的答案。

7个回答

6

.NET中有一个IPAddress类型,它有一个方便的方法TryParse

例子:

if(System.Net.IPAddress.TryParse(PossibleIPAddress, validatedIPAddress)){
    //validatedIPAddress is good
}

// or more simply:
bool IsValidIPAddress(string possibleIP){
    return System.Net.IPAddress.TryParse(PossibleIPAddress, null)
}

6

我以前做过这个,但我喜欢 Raymond Chen 在这篇文章中的建议:

http://blogs.msdn.com/oldnewthing/archive/2006/05/22/603788.aspx

他基本上支持使用正则表达式来找出标记。然后再对结果进行评估。他的例子如下:

function isDottedIPv4(s)
{
 var match = s.match(/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/);
 return match != null &&
        match[1] <= 255 && match[2] <= 255 &&
        match[3] <= 255 && match[4] <= 255;
}

看这个东西并理解它的预期功能要容易得多。


我在各种输入上进行了测试。看起来非常稳定。 - Milan Babuškov
你需要使用 +match[1] <= 255,否则你将会将字符串与整数进行比较。 - mplungjan
你需要使用+match[1] <= 255,否则你将会将字符串与整数进行比较。 - undefined

4

对于IPv4,您可以使用以下正则表达式。

\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b

看起来很复杂,但它通过将每个四边形限制在0-255的数字范围内来实现。


0

由于正则表达式的一半处理了最后一段没有句号的情况,如果在可能的IP地址末尾添加一个“.”,则可以将其减少一半。

像这样:

bool IsValidIPAddress(string possibleIP){
  CrazyRegex = \b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){4}\b
  return Regex.Match(possibleIP+'.', CrazyRegex)
}

0

@unsliced,你说得没错,但这当然取决于实现方式。如果你正在从访问你网站的用户那里解析IP地址,那么你可以使用正则表达式,因为它应该是x.x.x.x格式。

对于IPv6,你可以使用这个

[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}

然而,它并不能捕获所有内容,因为在IPv6中,情况要复杂得多。根据维基百科的说法,所有以下示例在技术上都是正确的,但是上面的正则表达式只会捕获带有*的那些。

2001:0db8:0000:0000:0000:0000:1428:57ab*
2001:0db8:0000:0000:0000::1428:57ab*
2001:0db8:0:0:0:0:1428:57ab*
2001:0db8:0:0::1428:57ab
2001:0db8::1428:57ab
2001:db8::1428:57ab

0

IPv4地址

这是一个可以验证格式但不能验证逻辑的模式

按Enter键验证格式 999.999.999.999

然后,我加入了一个改进版的此答案来处理逻辑

const isValidOctet = (num,index) => num <= 255 && (index < 2 ? num >= 1 : num >= 0);
window.addEventListener('DOMContentLoaded', () => {
  document.getElementById('txtSignDSCIPAdd').addEventListener('input', (e) => {
    const tgt = e.target;
    tgt.setCustomValidity('');
    const s = tgt.value.trim();
    const match = s.match(/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/);
    const valid = match != null &&
      isValidOctet(+match[1],0) && 
      isValidOctet(+match[2],1) && 
      isValidOctet(+match[3],2) && 
      isValidOctet(+match[4],3);
    if (match && !valid) {
      console.log(isValidOctet(match[0],valid,+match[1],0),isValidOctet(+match[2],1),isValidOctet(+match[3],2),isValidOctet(+match[4],3))
      tgt.setCustomValidity(`The entered IP address is not valid (match: ${match[0]}, valid: ${valid})`);
      tgt.reportValidity();
    }
  });
  // while testing
  document.querySelector('form').addEventListener('submit',(e) => { console.log('Submitted'); e.preventDefault() })

});
<form>
  <label for="">Signet/DSC IP Address</label>
  <span class="mandatory" style="color: red;">*</span>
  <input type="text" class="form-control" id="txtSignDSCIPAdd" pattern="\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}" required/>
</form>


-1

IPv4变成:/\d\d?\d?.\d\d?\d?.\d\d?\d?.\d\d?\d?/

我不确定IPv6的规则。


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