IPv4-Adresse mit angegebenem IP-Bereich / Maske übereinstimmen?

Wie kann ich mit PHP oder einem RegExp (oder beiden) einen Bereich von IP-Adressen abgleichen?

Beispiel für eingehende IPs
<code>10.210.12.12
10.253.12.12
10.210.12.254
10.210.12.95
10.210.12.60
</code>
Beispielbereiche
<code>10.210.12.0/24
10.210.12.0/16
10.210.*.*
10.*.*.*
</code>

Ich weiß, dass ich das kann:

<code>?:(?: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]?)
</code>

... aber Bereiche werden nicht berücksichtigt. Sie können lediglich eine eingehende Nummer abgleichen, um zu sehen, ob es sich um eine IP-Adresse handelt, bei der jedes Oktett zwischen 0 und 255 liegt.

BEARBEITEN:

Es gibt auch diese Funktion, die ich in einem Kommentar auf php.net zur ip2long-Funktion gefunden habe.

<code>function ip_in_network($ip, $net_addr, $net_mask){ 
    if($net_mask <= 0){ return false; } 
        $ip_binary_string = sprintf("%032b",ip2long($ip)); 
        $net_binary_string = sprintf("%032b",ip2long($net_addr)); 
        return (substr_compare($ip_binary_string,$net_binary_string,0,$net_mask) === 0); 
} 

ip_in_network("192.168.2.1","192.168.2.0",24); //true 
ip_in_network("192.168.6.93","192.168.0.0",16); //true 
ip_in_network("1.6.6.6","128.168.2.0",1); //false
</code>

Es ist kurz und bündig, passt aber nicht zur Sternchen-Situation. Ich weiß auch nicht, ob es völlig korrekt ist, weil es ein wahres Ergebnis liefert, als ich dachte, es wäre falsch:

<code>echo ip_in_network("192.168.2.1","192.167.0.0",1);
</code>

... aber vielleicht verstehe ich falsch, was die / 1 sein würde. Vielleicht musste ich / 24 verwenden.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage