Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Wyrazenia regularne
Forum PHP.pl > Forum > Przedszkole
dsk
Hej,

Pisze malutki kod do analizy logow/statystyk

Dziala poprawne dla '127.0.0.1:80'

  1. <?php
  2. preg_match_all('/((0|1[0-9]{0,2}|2[0-9]{0,1}|2[0-4][0-9]|25[0-5]|[3-9][0-9]{0,1}).){3}(0|1[0-9]{0,2}|2[0-9]{0,1}|2[0-4][0-9]|25[0-5]|[3-9][0-9]{0,1})(:[0-9]{1,5})/i', $data, $results, PREG_SET_ORDER);
  3. ?>


Chcialem dodac nowy preg_match_all, z regula dla cos w rodzaju
  1. '<center><td>Dowolny content</td><td>127.0.0.1</td><td>80</td>';
  2. '</tr>adres 127.0.0.1 port:80<center>'
  3. '<tr><td align="left">127.0.0.1</td>
  4. <td align="center">80</td>'


Chodzi o to, zeby zbieralo ip i port; niezaleznie co jest pomiedzy nimi, najlepiej jakby byla mozliwosc ustalenia maxymalnej ilosci znakow pomiedzy adresem ip i portem

Niestety moje obecnie umiejetnosci skonczyly sie na modyfikacji wyrazenia regularnego z neta, co wyzej widac
Bede bardzo wdzieczy za pomoc


Pozdrawiam
webdice
To wyrażenie to jest jakaś masakra. Wyrażenie dla adresu z portem będzie wyglądać mniej więcej tak:

Kod
#[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}:[0-9]{1,5}#


Oczywiście musi być jakieś ograniczenie na początku i końcu adresu, może to być ^ oraz $, ale w Twoim przypadku będą to raczej spacje, tabulatory lub tym podobne znaki.

P.S. Na przyszłość używaj bbcode.
-dsk-
sorry ze tyle nie pisalem;
dzieki za odpowiedz

co do samego wyrazenia regularnego, zauwaz ze adres jest max 255.255.255.2
Wiec, jako pierwszy znak w kazdym z przedzialow nie moze byc wiekszy od 2, drugi nie moze byc wiekszy od 5 jesli pierwszy jest rowny 2 itd.
jest to dosyc dokladna weryfikacja


Problem mam z tym
  1. '<center><td>Dowolny content</td><td>127.0.0.1</td><td>80</td>';
  2. '</tr>adres 127.0.0.1 port:80<center>'
  3. '<tr><td align="left">127.0.0.1</td>
  4. <td align="center">80</td>'


Jak napisac wyrazenie regularne zeby wyciagalo adres ip i zaraz po nim liczbe, w tym przypadku 80 ? omijajac to co jest pomiedzy nimi
czyli z powyzszego przykladu
127.0.0.1:80
127.0.0.1:80
127.0.0.1:80


Pozdrawiam
Trobin
Spróbuj może zrobić explode(); na dwukropku - w tablicy będziesz miał [0]=>ip [1]=>port. Dobrze rozumiem Twoje zamiary?
barthpl
  1. <?php
  2. function getIP( $text )
  3. { 
  4. $pattern = "/([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3})[^0-9]+([0-9]{1,5})/";
  5. preg_match_all( $pattern, $text, $ipArray, PREG_SET_ORDER );
  6.  
  7. $ipOutputSet = array();
  8. foreach( $ipArray as $ip ) {
  9. foreach( $ip as $key => $val )
  10. $ip[$key] = intval($val);
  11. if( ($ip[1] > 0 && $ip[1] < 256) && ($ip[2] >= 0 && $ip[2] < 256) && ($ip[3] >= 0 && $ip[3] < 256) && ($ip[4] >= 0 && $ip[4] < 256) )
  12. $ipOutputSet[] = sprintf( '%d.%d.%d.%d:%d', $ip[1], $ip[2], $ip[3], $ip[4], $ip[5] );
  13. }
  14. return $ipOutputSet;
  15. }
  16. ?>


Dla podanego przez ciebie przykładu wynik będzie taki jakiego oczekujesz.
  1. <?php
  2. $text = '<center><td>Dowolny content</td><td>127.0.0.4</td><td>80</td>';
  3. $text .= '</tr>adres 127.0.0.2 port:80<center>';
  4. $text .= '<tr><td align="left">127.0.0.3</td><td align="center">80</td>';
  5.  
  6. print_r( getIP($text) );
  7. ?>
Kod
Array
(
    [0] => 127.0.0.4:80
    [1] => 127.0.0.2:80
    [2] => 127.0.0.3:80
)

Mam nadzieję, iż o to chodziło winksmiley.jpg
dsk
barthpl działa !
dzieki wielkie smile.gif
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.