2011-05-03 3 views
35

Je suis newbie avec regex et je veux utiliser la fonction preg_match pour trouver si une chaîne est une adresse IP.Regex pour correspondre à une adresse IP

Par exemple, si $string = "45.56.78.222" ou quelque chose comme ça, preg_match($regex, $string) devrait renvoyer true. Alors, que devrait être $regex?

+2

Avez-vous essayé Google en premier? http://www.regular-expressions.info/regexbuddy/ipaccurate.html –

+4

'45.56.78.888' n'est pas une adresse IP. – kapa

+0

@bazmegakapa ouais je viens de réaliser, je l'ai écrit au hasard: D mais vous avez le point je pense;) – ibrahim

Répondre

105

Ne pas utiliser une expression régulière lorsque vous n'avez pas besoin :)

$valid = filter_var($string, FILTER_VALIDATE_IP); 

Bien que si vous ne voulez vraiment un ... regex

$valid = preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\z/', $string); 

Le regex mais ne validera le format, le maximum pour tout octet est le maximum pour un octet non signé, ou 255.

C'est pourquoi IPv6 est nécessaire - une adresse IPv4 est seulement 32bits long et Internet est populaire :)

+17

+1 pour 'filter_var' – kapa

+0

Est-ce que filter_var fonctionne pour: 1 comme IP? – super

+1

pour une bonne regex IP> http://stackoverflow.com/questions/9165922/regex-for-ip-address/20270082#20270082 – Alban

9
/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/ 

devrait faire pour votre exemple (qui ne contient une chaîne qui est pas une adresse IP). Et bien sûr, ce n'est qu'une adresse IPv4.

+0

@alex: Alors 999.999.999.999 sera aussi IP valide alors !! ?? –

+0

@PratikCJoshi: La question originale (qui a été éditée des années après ma réponse) a demandé une regex qui correspondrait à n'importe quelle séquence de quatre nombres séparés par des points de jusqu'à 3 caractères chacun ... –

+0

C'est assez simple mais personne ne voudrait Mauvaise adresse IP. S'il vous plaît envisager d'ajouter l'adresse IP valide Regex aussi comme la réponse. Voir les gens viennent sur cette page en considérant qu'ils obtiendraient Regex pour ** adresse ** valide **, mais ils ne reçoivent pas ce Regex. Merci –

4
/^(?:(?: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]?)$/ 

Cela vérifiera la gamme parfaite y compris si une plage est supérieur à 255 de l'un des 4.