Diskuze: regulární výraz pro kontrolu ip adresy

PHP PHP regulární výraz pro kontrolu ip adresy American English version English version

Avatar
martinkobelka
Redaktor
Avatar
martinkobelka:

Zdravím.
V regulárních výrazech jsem začátečník, a potřebovat bych napsat regulární výraz, který zkontroluje, jestli zadaná IP adresa je skutečně ip adresa.
Nevím si rady, zatím mám jen

function is_ip($ip){
    if (preg_match("/^[0123456789][0123456789][0123456789][0123456789].[0123456789][0123456789][0123456789][0123456789].[0123456789][0123456789][0123456789][0123456789].[0123456789][0123456789][0123456789][0123456789].[0123456789][0123456789][0123456789][0123456789]$/", $ip)){
        return TRUE;
    }
    else{
        return FALSE;
    }
}

ale to asi nebude dobré, ani správné.

 
Odpovědět 16.8.2012 11:39
Avatar
Drahomír Hanák
Tým ITnetwork
Avatar
Odpovídá na martinkobelka
Drahomír Hanák:

Jednak můžeš psát [0-9] (nebo jen \d) a taky můžeš uvést přesný počet opakování do složených závorek. Musíš počítat s tím, že v IP může každé číslo být 0-255 tedy jedna až tři číslice. preg_match by mohl vypadat nějak takto:

preg_match("/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/", $ip)

\d zastupuje jakoukoli číslici, výraz {1,3} zopakuje předchozí znak (tedy \d - libovolnou číslici) jednou až tři krát.

 
Nahoru Odpovědět 16.8.2012 12:02
Avatar
Kit
Redaktor
Avatar
Odpovídá na martinkobelka
Kit:

Problém takového testu je, že v něm projde i IP adresa od Sandry Bullock "23.75.345.200". Lepší by bylo takovou adresu přečíst jako 4 celá čísla oddělená tečkami a vyhodnotit, zda je každé číslo v rozsahu 0-255.

Ještě lepší by bylo, kdyby ta funkce rovnou konvertovala adresu do 32bitového integeru a v případě neúspěchu vyhodila výjimku. S takovou funkcí by se pracovalo mnohem lépe a byla by užitečnější.

Nahoru Odpovědět 16.8.2012 17:46
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
David Jančík [sczdavos]:

Díval jsem se, že PHP má nějakou validaci:
http://php.net/…lidation.php

Máš s tím nějakou zkušenost?

Nahoru Odpovědět 16.8.2012 18:35
Čím více času dostaneš, tím méně ho máš.
Avatar
Kit
Redaktor
Avatar
Kit:

Pokud taková funkce existuje, je vždy dobré ji využít. Neznal jsem ji a hned jsem ji vyzkoušel:

<?php
function filtr($ip) {
        echo $ip,filter_var($ip, FILTER_VALIDATE_IP)?" platná":" neplatná","\n";
}
filtr('127.0.0.1');
filtr('327.0.0.1');
filtr('127.200.0.1');
filtr('127.256.0.1');
filtr('127.255.0.255');
filtr('23.75.345.200');

Výsledek:

127.0.0.1 platná
327.0.0.1 neplatná
127.200.0.1 platná
127.256.0.1 neplatná
127.255.0.255 platná
23.75.345.200 neplatná
Nahoru Odpovědět  +1 16.8.2012 18:50
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
martinkobelka
Redaktor
Avatar
martinkobelka:

Nejlepší bude, když uvedu na co to chci. Třeba to někomu pomůže.
Tvořím administraci webu, a tuto kontrolu potřebuji pro zadání ip adresy do formuláře. Pro zadanou IP adresu bude web nepřístupný.

 
Nahoru Odpovědět 16.8.2012 21:15
Avatar
Kit
Redaktor
Avatar
Odpovídá na martinkobelka
Kit:

V tom případě bude asi funkce filter_var($ip, FILTER_VALIDATE_IP) to pravé.

function is_ip($ip){
    return is_string(filter_var($ip, FILTER_VALIDATE_IP));
}

na http://www.php.net/…validate.php
jsou k dispozici další možnosti filtrování IP.

Nahoru Odpovědět 16.8.2012 21:40
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.