[PHP] String controleren of het een IP-mask is

Pagina: 1
Acties:

  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 21:43
Ik wil controleren of de data die een user invoert (opgeslagen in $data) voldoet aan de volgende eisen:

Het mag zijn:
*
*.
*.*
*.*.
*.*.*
*.*.*.
*.*.*.*

waar de *'s een getal tussen de 0 en de 255 zijn .. Wat is het? Juist.. een IP :)

Maar hoe controleer ik hierop? De string kan sowiezo niet te lang zijn, misschien handig om te weten (textbox is niet langer)...

Thanx!

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
met een regex, bijvoorbeeld:
code:
1
2
3
4
if ( preg_match("/[0-9]{1,3](\.[0-9]{1,3})*/", $ip))
    // goed
else
    // fout

maar tomato kan het vast beter :) (dit matched ook bijvoorbeeld 999.999)

zo zou het ook kunnen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
function validateIP($ip)
{
    $dingen = explode(".", $ip);
    for ($i = 0; $i < count($dingen); $i++)
    {
      if (! preg_match("[0-9]+", $dingen[$i])
        return false;

      if ($dingen[$i] < 0 || $dingen[$i] > 255) return false;
    }
    return true;
}

[edit]oeps, foutje

  • tomato
  • Registratie: November 1999
  • Niet online
Zoek eens op regular expressions en IP masks. Dan moeten er genoeg patterns te vinden zijn waar al over nagedacht is :)

  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 21:43
Op donderdag 08 november 2001 00:39 schreef marcusk het volgende:
met een regex, bijvoorbeeld:
code:
1
2
3
4
if ( preg_match("/[0-9]{1,3](\.[0-9]{1,3})*/", $ip))
    // goed
else
    // fout

maar tomato kan het vast beter :) (dit matched ook bijvoorbeeld 999.999)
Mwa.. als ik eerst hierop check, kan ik daarna door met checken of het allemaal wel getallen boven de 0 en onder de 266 zijn (explode ofzo)..

naja, ik ga eerst wel eens even op us.php.net zoeken :) Maar als jullie het antwoord hebben ga ik toch toegeven aan me luie opzoek-karakter >:)

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Op donderdag 08 november 2001 00:43 schreef elviver het volgende:
Mwa.. als ik eerst hierop check, kan ik daarna door met checken of het allemaal wel getallen boven de 0 en onder de 266 zijn (explode ofzo)..
hehe, zie mn edit hierboven :)

  • tomato
  • Registratie: November 1999
  • Niet online
marcusk: maar tomato kan het vast beter :) (dit matched ook bijvoorbeeld 999.999)
Ik wil er wel eentje posten, maar dan tik ik hem ook maar ergens van over. Heeft niet zo veel zin hier te diep over na te denken als dat al zo vaak gedaan is (of je wilt er iets van leren natuurlijk ;) ).

Ik zou nog wel als tip willen geven om anchors te gebruiken (een maxlength text box is nou ook niet wat je noemt safe), dus
code:
1
/^jeleukepattern$/

  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 21:43
Op donderdag 08 november 2001 00:46 schreef tomato het volgende:
Ik wil er wel eentje posten, maar dan tik ik hem ook maar ergens van over.
Graag!! >:)
Op donderdag 08 november 2001 00:46 schreef tomato het volgende:
of je wilt er iets van leren natuurlijk ;)
Dat ook, maar dat doe ik dan wel aan de hand van het voorbeeld (zo heb ik me hele PHP-kennis vergaard :P

Thanx ;)

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
IIRC stond er één in Mastering Regular Expressions

  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 21:43
Op donderdag 08 november 2001 00:49 schreef marcusk het volgende:
IIRC stond er één in Mastering Regular Expressions
Uh???

Naja.. Ik loop even op en neer naar de snackbar, hard nadenkend ondertussen... :) Hopelijk kan ik me strakkies verbazen over de intellegentie van sommige mensen? ;) Thanx

  • tomato
  • Registratie: November 1999
  • Niet online
Trouwens, een IP mag helemaal niet deze vorm hebben: *.*
Het zijn altijd vier nummer gescheiden door punten. En er mogen trouwens wel nullen in zitten.

  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 21:43
Op donderdag 08 november 2001 00:51 schreef tomato het volgende:
Trouwens, een IP mag helemaal niet deze vorm hebben: *.*
Het zijn altijd vier nummer gescheiden door punten. En er mogen trouwens wel nullen in zitten.
Ja, maar voor mijn toepassing wel.. Masks enzo namelijk :)

Ik ga nu echt lopen (fiets gejat :().. tozzo! :)

  • tomato
  • Registratie: November 1999
  • Niet online
marcusk: IIRC stond er één in Mastering Regular Expressions
Dat klopt. Ik tik hem nu voor je over ;)
code:
1
2
3
4
5
6
7
8
9
/^
    ([01]?\d\d?|2[0-4]\d|25[0-5])
    \.
    ([01]?\d\d?|2[0-4]\d|25[0-5])
    \.
    ([01]?\d\d?|2[0-4]\d|25[0-5])
    \.
    ([01]?\d\d?|2[0-4]\d|25[0-5])
$/

Maar dit matcht nog steeds iets als 0.0.0.0 wat weer niet mag (maar iets als 23.0.4.255 mag wel), dus je kunt het nog een stuk ingewikkelder maken (maar of je dat dan nog het beste met een regex kunt doen is de vraag).

  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 21:43
Interessant, interessant! :)

Ik ga het proberen! Ook ga ik dan maar even een beetje leren over regexp's enzo (er is maar 1 plaats waar ik die controle nodig heb..), dus komt wel goed! :)

Morgen eerst maar weer eens naar college toe fietsen (JA ik heb er weer een! *D Snackbar-tripje HANDIG!).. Zie ik dan wel verder ofzo :)

  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 21:43
en (hoe pijnlijk ook :P) dit is de functie geworden :)
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?
function checkip($input) {
  $temp = explode(".", $input);
  if (count($temp) > 4) { return false; } // niet waar omdat meer dan 3 punten erin zitten
  if (!eregi("^[0-9]{1,3}$", $temp[0])) { return false; } // eerste eenheid bestaat niet uit getallen of meer dan 3!!
  if (substr($temp[0],0,1) == '0') { return false; } // eerste eenheid begint met een nul!!
  if (($temp[0] < 0) || ($temp[0] > 255)) { return false; } // eerste eenheid kleiner dan 0 of groter dan 255
  for ($i = 1; $i < count($temp); $i++) {
    if (!eregi("^[0-9]{0,3}$", $temp[$i])) { return false; } // eenheid bestaat niet uit getallen of meer dan 3!!
    if ((!$temp[$i]) &amp;&amp; ($temp[$i + 1]) &amp;&amp; (strlen($temp[$i]) == 0)) { return false; } //'er is een lege eenheid!!
    if ((substr($temp[$i],0,1) == '0') &amp;&amp; (strlen($temp[$i]) > 1)) { return false; } // combinatie 0* !!
    if (($temp[$i] < 0) || ($temp[$i] > 255)) { return false; } // later eenheid kleiner dan 0 of groter dan 255
  }
  return true; // GOED!
}
?>

Als iemand nog betere weet: Graag! ;)

  • igmar
  • Registratie: April 2000
  • Laatst online: 09-09 19:53

igmar

ISO20022

Maar dit matcht nog steeds iets als 0.0.0.0 wat weer niet mag (maar iets als 23.0.4.255 mag wel), dus je kunt het nog een stuk ingewikkelder maken (maar of je dat dan nog het beste met een regex kunt doen is de vraag).
0.0.0.0 is over het algemeen geen restrictie of alle IP's.

  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 21:43
Op donderdag 08 november 2001 09:24 schreef igmar het volgende:
0.0.0.0 is over het algemeen geen restrictie of alle IP's.
Bij mijn toepassing wel.. Bovenin de topic staat wat mag en wat niet, en mijn functie van een paar posts terug doet het wel goed, alleen is niet echt mooi ofzo..

Als iemand iets beters weet ;)
Pagina: 1