Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
martinkobelka
Tvůrce
Avatar
martinkobelka:16.8.2012 11:39

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
Odpovídá na martinkobelka
Drahomír Hanák:16.8.2012 12:02

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
Tvůrce
Avatar
Odpovídá na martinkobelka
Kit:16.8.2012 17:46

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
David Jančík
Vlastník
Avatar
Odpovídá na Kit
David Jančík:16.8.2012 18:35

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
Zapomeň, že je to nemožné a udělej to ;)
Avatar
Kit
Tvůrce
Avatar
Kit:16.8.2012 18:50

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
16.8.2012 18:50
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
martinkobelka
Tvůrce
Avatar
martinkobelka:16.8.2012 21:15

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
Tvůrce
Avatar
Odpovídá na martinkobelka
Kit:16.8.2012 21:40

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.