RegEx 10.7.0.* bis 10.7.31.*

thing

Mitglied
Hallo,

leider habe ich bislang zu meinem Problem nirgends etwas gefunden. Ich möchte in einem PHP-Script mittels RegEx die IPs von 10.7.0.* bis 10.7.31.* matchen.

Zuerst habe ich es mit

10\.7\.(0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31)\.

probiert, dann aber recht schnell gemerkt, dass es mit

10\.7\.([0-9]|[1-2][0-9]|3[0-1])\.

genau so funktioniert.

Nun aber die Frage, ob es nicht eine geeignetere Methode gibt Zahlenfolgen (in meinem Fall eben von 0 bis 31) zu matchen ? Logischerweise (und leider) funktioniert ein [0-31] natürlich nicht ;).

Für Vorschläge wäre ich dankbar, auch wenn mein Problem ja prinzipiell gelöst ist ;).

Gruß thing
 
Nein, denn reguläre Ausdrücke werden zeichenweise verarbeitet und nicht etwa „tokenweise“. Dass es sich bei einer Zeichensequenz um mehr handelt als eine Aneinanderreihung von Zeichen, kann er nicht wissen.
 
Du könntest auch die in den Kommentaren der ip2long()-Funktionsreferenzseite beschriebene net_match()-Funktion nutzen:
PHP:
<?php

	function net_match($network, $ip)
	{
		$ip_arr = explode('/', $network);
		$network_long = ip2long($ip_arr[0]);
		$x = ip2long($ip_arr[1]);
		$mask = long2ip($x) == $ip_arr[1] ? $x : 0xffffffff << (32 - $ip_arr[1]);
		$ip_long = ip2long($ip);

		return ($ip_long & $mask) == ($network_long & $mask);
	}

	var_dump( net_match('10.7.0.1/27', '10.7.0.31') );
	var_dump( net_match('10.7.0.1/27', '10.7.0.32') );

?>
 

Neue Beiträge

Zurück