Come valutare un IP?
-
09-06-2019 - |
Domanda
Come posso determinare se una stringa è un indirizzo IP?Sia IPv4 o IPv6?
Che cosa è il minimo e il maggior numero di caratteri?
Presumo che questo sarebbe un regex risposta.
Soluzione
Ma la questione non è così semplice come ipotizzando a.b.c.d
... ci sono il modo più moduli di quanto realizzato.
Ma sicuramente questo è un Google domanda?Praticamente ogni regex primer che si possono trovare ovunque utilizza IP come esempio! ipv4 + regex punteggi 183,000 hits!
Altri suggerimenti
Ho fatto questo prima, ma mi piace Raymond Chen post a:
http://blogs.msdn.com/oldnewthing/archive/2006/05/22/603788.aspx
Dove ha fondamentalmente incoraggia l'utilizzo di espressioni regolari per quello che stanno bene a:l'analisi di gettoni.Poi valutare i risultati.Il suo esempio:
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;
}
È molto più facile guardare e capire ciò che si suppone di fare.
In .NET c'è un Indirizzo ip del tipo che ha un metodo pratico TryParse.
Esempio:
if(System.Net.IPAddress.TryParse(PossibleIPAddress, validatedIPAddress)){
//validatedIPAddress is good
}
// or more simply:
bool IsValidIPAddress(string possibleIP){
return System.Net.IPAddress.TryParse(PossibleIPAddress, null)
}
Per IPv4 è possibile utilizzare questa espressione regolare.
\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
Sembra abbastanza complesso ma funziona limitando ogni quad per i numeri da 0 a 255.
@unsliced:vero, questo problema può ottenere un po ' pazzo.
Se si ha realmente bisogno per gestire i possibili indirizzo IP, quindi dovrete mettere insieme qualcosa di più sofisticato.
Tuttavia, se si desidera eseguire la convalida di base per assicurarsi che gli utenti stanno inserendo correttamente i dati formattati, penso che sia giusto limitare l'una.b.c.modello d con sopra le espressioni regolari.
@unsliced che è corretto però non dipenderà, ovviamente, l'attuazione, se l'analisi di un IP da un utente che visita il tuo sito, i tuoi sono ottimi per l'utilizzo di espressioni regolari, come DOVREBBE essere in x.x.x.x formato.
Per IPv6 è possibile utilizzare questo
[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}
tuttavia, non prendere il tutto, perché con IPv6 è molto più complicato, secondo wikipedia tutti gli esempi seguenti sono technicaly corretto però la regex sopra solo prendere quelli con un *
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
Dal momento che la metà di quella regex gestisce il fatto che l'ultimo segmento non ha un periodo alla fine, si poteva tagliare a metà, se virare un '.' per la fine della sua eventuale indirizzo IP.
Qualcosa di simile a questo:
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)
}
IPv4 diventa: /\d\d?\d?.\d\d?\d?.\d\d?\d?.\d\d?\d?/
Io non sono sicuro circa l'IPv6 regole.