#1 23. 3. 2009 23:16

ZuseX4
Člen
Registrovaný: 24. 2. 2009
Příspěvky: 6

RegExp (Perl-compatible) detekce IP adresy

Zdravim, zrovna jsem řešil detekci ip adresy. Všude na netu jsem našel pouze hodně dlouhá, neohrabaná řešení. Dostal jsem takovou myšlenku. Všechny řešení, které jsem našel byla založena na tom, že se ip rozdělila na 3 octety s tečkou a 4. octet. Napadlo mě, že by to možná nemuselo být nutné a tak jsem zkoušel vlastní řešení.

  1. Začal jsem od jednoduché detekce octetu (0–255) #(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])#
  2. Přidal jsem k němu tečku a octet dal do opakování (4×). To jsem dostal něco jako #((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){4}#
  3. Nyní přišla na řadu poslední tečka – jak se vyvarovat formátu "x.x.x.x."
  4. Napadlo mě, že tři první tečky se liší – následují za nimi totiž čísla (resp. nenásleduje konec řetězce)
  5. Využil jsem tedy šikovného lookahead a dostal jsem tak #((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.(?!$)){4}#
  6. To by však stále nefungovalo, protože místo těčky se musí najít nějaký znak, který mi splní poslední 4. cyklus opakování – použil jsem konec řetězce. Tím jsem dostal #((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])(\.(?!$)|$)){4}#
  7. Stále to však není dokonalé. Výraz se dá oblafnout pokud za poslední tečku dám ještě nejaký znak – tak jsem to jednoduše zakázal: #^((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])(\.(?!$)|$)){4}$#

A teď dotazy na závěr. Našel by někdo nějaký nevalidní řetězec, který by kontrolou prošel? Nebo se opravdu jedná o 100% řešení? Popř. máte někdo nějaké ještě lepší řešení? A není moje řešení náročnější než způsob zmíněný na začátku?

Předem díky

Editoval ZuseX4 (27. 3. 2009 1:59)

Offline

 

#2 23. 3. 2009 23:58

paranoiq
Člen
Místo: Tábor
Registrovaný: 14. 11. 2006
Příspěvky: 188

Re: RegExp (Perl-compatible) detekce IP adresy

tahle ip adresa rozhodně neprojde: 2001:db8::1428:57ab


Z Javy do PHP nikdy nic dobrého nepřišlo. / http://twitter.com/paranoiq

Offline

 

#3 24. 3. 2009 0:21

ZuseX4
Člen
Registrovaný: 24. 2. 2009
Příspěvky: 6

Re: RegExp (Perl-compatible) detekce IP adresy

paranoiq napsal(a):

tahle ip adresa rozhodně neprojde: 2001:db8::1428:57ab

:) Tušil jsem, že to někdo nadhodí, ale podle mě je situace podobná. Jen se nebude řešit tečka ale dvojtečka. Nebo ještě něco?

Offline

 

#4 24. 3. 2009 0:25

kravco
Moderator
Místo: Bratislava
Registrovaný: 15. 6. 2008
Příspěvky: 566

Re: RegExp (Perl-compatible) detekce IP adresy

Chýba ti spojovník v prvej hranatej zátvorke. Vylúčil si adresy 251.x.x.x254.x.x.x. Takisto je otázna platnosť adresy 000.1.2.3 (tri nuly za sebou), na odstránenie by bolo treba upraviť výraz napr. takto:

#^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(?!$)|$)){4}$#

ZuseX4 napsal(a):

:) Tušil jsem, že to někdo nadhodí, ale podle mě je situace podobná. Jen se nebude řešit tečka ale dvojtečka. Nebo ještě něco?

Bude treba akceptovať aj krátku formu, napr ::1 či minimálne ::, to už asi len tak jednoducho nepôjde.

Editoval kravco (24. 3. 2009 1:46)

Offline

 

#5 27. 3. 2009 2:02

ZuseX4
Člen
Registrovaný: 24. 2. 2009
Příspěvky: 6

Re: RegExp (Perl-compatible) detekce IP adresy

kravco napsal(a):

Chýba ti spojovník v prvej hranatej zátvorke.

Dík, spraveno

Takisto je otázna platnosť adresy 000.1.2.3 (tri nuly za sebou)

Díky za info, nevěděl jsem, že tři nuly za sebou je nevalidní zápis

Bude treba akceptovať aj krátku formu, napr ::1 či minimálne ::, to už asi len tak jednoducho nepôjde.

Má to nějaká specifická pravidla, nebo jde jen o prosté vynechávání?

Editoval ZuseX4 (27. 3. 2009 2:07)

Offline

 

#6 27. 3. 2009 14:13

kravco
Moderator
Místo: Bratislava
Registrovaný: 15. 6. 2008
Příspěvky: 566

Re: RegExp (Perl-compatible) detekce IP adresy

ZuseX4 napsal(a):

Díky za info, nevěděl jsem, že tři nuly za sebou je nevalidní zápis

Platnosť je z môjho pohľadu otázna, IP adresa je 32-bitové číslo, takýto zápis ho určuje jednoznačne, no existuje aj kratší, ktorý reprezentuje tú istú adresu… Keď chceš akceptovať užívateľský vstup, môžeš akceptovať aj 10.000.00.1, no prezentovať by si mal kanonický zápis.

Bude treba akceptovať aj krátku formu, napr ::1 či minimálne ::, to už asi len tak jednoducho nepôjde.

Má to nějaká specifická pravidla, nebo jde jen o prosté vynechávání?

Dve dvojbodky znamenajú doplnenie nulami, teda ::1 znamená 0000:0000:0000:0000:0000:0000:0000:0001

Editoval kravco (27. 3. 2009 14:13)

Offline

 

Zápatí