Avatar billede minijensen1 Nybegynder
19. oktober 2004 - 15:16 Der er 9 kommentarer og
1 løsning

Match IP (med mask og RegExp)

Hej.
Jeg søger en metode at kunne matche en IP maske (f.eks. 192.168.0.*) med en IP (f.eks. 192.168.0.1, 192.168.0.2, osv). Men ved ikke helt hvordan det gøres.
Har prøvet at kigge på nogle regular expressions, men forstår ikke helt så meget af dem.

Indtil videre er jeg kommet hertil med min kode:
<?php

function matchip($mask, $ip) {
  if (ereg($mask, $ip)) {
    return "$ip matches $mask";
  } else {
    return "$ip <b>dont</b> matches $mask";
  }
}

echo matchip("192.168.0.*", "192.168.0.1")."<br>";
echo matchip("192.168.*.*", "192.168.0.1")."<br>";
echo matchip("192.168.*.2", "192.168.0.1")."<br>";
echo matchip("*.*.0.*", "192.168.0.1")."<br>";
echo matchip("*.webspeed.dk", "en.bruger.på.webspeed.dk")."<br>";
echo matchip("*.*.webspeed.dk", "en.bruger.på.webspeed.dk")."<br>";
echo matchip("*.*speed.dk", "en.bruger.på.webspeed.dk")."<br>";
echo matchip("en.*.*speed.dk", "en.bruger.på.webspeed.dk")."<br>";
echo matchip("en.*.speed.dk", "en.bruger.på.webspeed.dk")."<br>";

?>

Men det giver følgende fejl, så længe * står først i masken:
Warning: ereg(): REG_BADRPT:erepetition-operator operand invalid in C:\Programmer\Apache Group\Apache2\htdocs\matchip.php on line 4
192.168.0.1 dont matches *.*.0.*

Har prøvet at søge rundt her på eksperten, samt på php's side - men har ikke fundet noget.

Nogen som kan/vil forklare mig hvordan det kan løses?
Avatar billede bojo Nybegynder
19. oktober 2004 - 15:42 #1
du skal nok bruge nogle escapes \ foran . og *

. betyder alt undtagen newline
* betyder 0 eller flere match
Avatar billede erikjacobsen Ekspert
19. oktober 2004 - 15:44 #2
Prøv denne. Du kan teste dit script på http://test.n0p.com/eksperten/552133/

function matchip($mask, $ip) {
  $mask = str_replace('.','\\.',$mask);
  $mask = str_replace('*','[^.]',$mask);
  if (ereg('^'.$mask.'$', $ip)) {
    return "$ip matches $mask";
  } else {
    return "$ip <b>dont</b> matches $mask";
  }
}
Avatar billede erikjacobsen Ekspert
19. oktober 2004 - 15:45 #3
Skal nok være
    $mask = str_replace('*','[^.]+',$mask);
Avatar billede minijensen1 Nybegynder
20. oktober 2004 - 13:28 #4
hmm, havde godt nok leget lidt med den \. - men ikke lige [^.]+

Men det ser godt ud det du har lavet erikjacobsen. Men har vist ikke lige fået forklaret den match med hostmask i mit spørgsmål. Det er meningen at den skal matche følgende (egentlig ligesom et ban matches på IRC):
en.bruger.på.webspeed.dk matches *.webspeed.dk
en.bruger.på.webspeed.dk matches *.*.webspeed.dk
en.bruger.på.webspeed.dk matches *.*speed.dk
en.bruger.på.webspeed.dk matches en.*.*speed.dk
en.bruger.på.webspeed.dk dont matches en.*.speed.dk
en.bruger.på.webspeed.dk dont matches *.*.*.*.*speed.dk

Men hvis ikke det er 'ligetil', så er det nuværende også godt nok.
Avatar billede erikjacobsen Ekspert
20. oktober 2004 - 14:47 #5
Det kan vel gøres, for jeg kan forstå af dine eksempler at det
første * skal matche hvad som helst, mens de efterfølgende kun skal
matche "alt undtagen punktum" - hvis jeg læser det korrekt.

Så skal du bare lave en lidt mere intelligent substituering af stjernerne ;)
Avatar billede minijensen1 Nybegynder
20. oktober 2004 - 15:52 #6
Tror bedst at jeg kan forklare det med at en stjerne skal matche enten alt fra start strengen, til det efter stjernen (f.eks. *.webspeed.dk matcher alt i stil med en.bruger.på.webspeed men også en.wespeed.dk - og ikke bare webspeed.dk)
ved en stjerne midt i en streng, skal det før og det efter stjernen matche dvs (en.*.webspeed.dk matcher en.bruger.på.webspeed.dk men også en.test.webspeed.dk - og ikke bare en.webspeed.dk)
og med stjerne til sidst er det bare omvendt af den første.
Er der to stjerner er det lidt en sammenblanding, f.eks. ved *.*.webspeed, kræver det at der står noget foran et punktum (uanset hvad - bare noget), derefter skal der står noget efter punktummet (og før det næste - igen uanset hvad - kunne godt være hej.med.dig der står)
(Og nu begynder det at lyde kringlet det jeg siger, tror bare jeg stopper med forklaringer her)

En mere intelligent substituering af stjernene siger du? Har jeg ingen anelse om hvordan skal gøres. RegExp er noget jeg længe har ville kigge på, da jeg mener at det kan læse en masse for en - men hver gang jeg starter på en tutorial går jeg altid i stå. Har endnu ikke præsteret at forstå for meget af det. :(
Så har ingen anelse om hvordan en mere intelligent substituering f.eks. ville se ud.
Avatar billede erikjacobsen Ekspert
20. oktober 2004 - 19:46 #7
Prøv om du kan se på mit link, om der er forbedringer. Jeg har blot behandlet
det første * anderledes end de andre.
Avatar billede minijensen1 Nybegynder
30. oktober 2004 - 15:13 #8
hmm, jeg er vist kommet lidt væk fra at jeg havde oprettet et spørgsmål her.

Det virker meget bedre nu erik, hvis du smider et svar kan jeg lige acceptere det =)
Avatar billede erikjacobsen Ekspert
30. oktober 2004 - 16:45 #9
Tak, men jeg samler slet ikke på point.
Avatar billede minijensen1 Nybegynder
24. november 2004 - 09:48 #10
Så må jeg jo bare selv tage dem, så der kan blive lukket - mange tak for hjælpen =)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester