Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] Wyrazenia regularne, preg_match_all 127.0.0.1:80
dsk
post 29.07.2008, 19:45:17
Post #1





Grupa: Zarejestrowani
Postów: 30
Pomógł: 3
Dołączył: 7.03.2006

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
webdice
post 29.07.2008, 20:02:07
Post #2


Developer


Grupa: Moderatorzy
Postów: 3 045
Pomógł: 290
Dołączył: 20.01.2007




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.
Go to the top of the page
+Quote Post
--dsk--
post 25.08.2008, 19:20:52
Post #3





Goście







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
Go to the top of the page
+Quote Post
Trobin
post 25.08.2008, 20:04:32
Post #4





Grupa: Zarejestrowani
Postów: 82
Pomógł: 6
Dołączył: 23.03.2008
Skąd: Szczecin

Ostrzeżenie: (0%)
-----


Spróbuj może zrobić explode(); na dwukropku - w tablicy będziesz miał [0]=>ip [1]=>port. Dobrze rozumiem Twoje zamiary?


--------------------
Pracuję na: Apache 2.2.4, MySQL 5.0.20a, PHP 5.3.0
Go to the top of the page
+Quote Post
barthpl
post 25.08.2008, 20:26:57
Post #5





Grupa: Zarejestrowani
Postów: 142
Pomógł: 35
Dołączył: 5.12.2006
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


  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


--------------------
Jeżeli pomogłem rozwiązać Twój problem, kliknij pomógł.
Go to the top of the page
+Quote Post
dsk
post 25.08.2008, 20:57:59
Post #6





Grupa: Zarejestrowani
Postów: 30
Pomógł: 3
Dołączył: 7.03.2006

Ostrzeżenie: (0%)
-----


barthpl działa !
dzieki wielkie smile.gif
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 24.07.2025 - 14:23