Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]preg_match i ipv4
Forum PHP.pl > Forum > Przedszkole
Viters
Cześć. Nie mam już siły do wyrażeń regularnych :<

  1. <?php
  2.  
  3. $tekst = file_get_contents('wikipedia.txt');
  4.  
  5. $pattern = '[" \.,!\?;\):]{1}(\d{1,2}|1\d\d|2[0-5][0-5])\.(\d{1,2}|1\d\d|2[0-5][0-5])\.(\d{1,2}|1\d\d|2[0-5][0-5])\.(\d{1,2}|1\d\d|2[0-5][0-5])';
  6. preg_match($pattern, $tekst, $match);
  7.  
  8. count($match);
  9.  
  10. ?>


W regexp.pl działa, po uruchomieniu na serwerze wyrzuca błąd:
Warning: preg_match() [function.preg-match]: Unknown modifier '(' on line 6

Zawartość pliku txt:
Cytat
Adres ip to 192.168.12.33 oraz 222.254.1.1. Nieprawidlowym adresem jest np.
256.222.11.1, 225.300.25.95 i 225.25.455.95.


Jeszcze raz proszę was o pomoc. Z góry dzięki.
Pozdrawiam.
wookieb
http://php.net/filter_var
http://www.php.net/manual/en/filter.filters.validate.php -> FILTER_VALIDATE_IP -> FILTER_FLAG_IPV4
Viters
Zwróci mi to wyniki z tekstu? Zresztą wolałbym raczej ogarnąć te wyrażenia.
erix
A czy klawiatura odgryzie Ci palce, jeśli spróbujesz?
by_ikar
Zacznijmy od tego że wyrażenie należy osadzić między jakimiś dwoma znakami, dość często są to slashe, płotki (#), czy nawet małpy. Nie użyłeś żadnego takiego znaku, to ci wywala błąd. Druga sprawa, to twoje wyrażenie, jeżeli szukasz jakiegokolwiek adresu IP, to możesz to zrobić w prostszy sposób:

  1. <?php
  2.  
  3. $str = '192.168.1.1 ';
  4.  
  5. preg_match('/([\d]{1,3}.[\d]{1,3}.[\d]{1,3}.[\d]{1,3})/', $str, $matches);
  6.  
  7. echo '<pre>'.print_r($matches, true).'</pre>';


Lub bardziej zaawansowane pomijające przykładowo adresy lokalne (127/168/ itp):


  1. <?php
  2.  
  3. $str = '77.254.171.90 ';
  4.  
  5. preg_match('/((([\d]{1,3})(?<!127|10|255)\.([\d]{1,3}))(?<!169.254|192.168|172.(1[6-9]|2[0-9]|3[0-1]))\.([\d]{1,3}))(?<!192.0.2)\.([\d]{1,3})/', $str, $matches);
  6.  
  7. echo '<pre>'.print_r($matches, true).'</pre>';


Ale IMO lepiej jest użyć gotowych funkcji, jakie wyżej moi przedmówcy podali.
Viters
Bardzo dziękuję na pomoc. Działa tak, jak powinno. Przy okazji - wytłumaczę się - by_ikar, twój algorytm pokazuje liczby w zakresie 0-999, ja niestety potrzebuję 0-255. Oczywiście, podzielam wasze zdanie jeżeli chodzi o używanie gotowych funkcji, zamiast męczenia się z czymś takim, jednak to jest raczej "ćwiczenie" z wyrażeń regularnych, dlatego zależało mi na rozwiązaniu związanym z nimi.

Jeszcze raz dziękuję i pozdrawiam.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.