Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyrażenie regularne
Forum PHP.pl > Forum > PHP
Mlodycompany
Witam. Przejdę od razu do rzeczy. Mam taki ciąg znaków
Kod
Dec  2 13:24:40 zzz sshd[7317]: Failed password for bin from xx.xx.xx.xx port 39817 ssh2
a do niego taki wzór
Kod
/^([a-zA-Z]{3})( {1,2})([0-9]{1,2}) ([0-9]{2}):([0-9]{2}):([0-9]{2}) (.*?) (.*?): (.*?)$/
Preg_match zwraca
Kod
array(10) {
  [0]=>
  string(95) "Dec  2 13:24:40 zzz sshd[7317]: Failed password for bin from xx.xx.xx.xx port 39817 ssh2"
  [1]=>
  string(3) "Dec"
  [2]=>
  string(2) "  "
  [3]=>
  string(1) "2"
  [4]=>
  string(2) "13"
  [5]=>
  string(2) "24"
  [6]=>
  string(2) "40"
  [7]=>
  string(3) "zzz"
  [8]=>
  string(10) "sshd[7317]"
  [9]=>
  string(56) "Failed password for bin from xx.xx.xx.xx port 39817 ssh2"
}
a chciałbym aby zwrócił tylko i wyłącznie ostatni element tablicy. Wiem, że mogę to zrobić po prostu w kodzie np.
  1. $arr[9]
ale mi chodzi o to aby we wzorze wyrażenia ograniczyć elementy, które maja być zwracane. Ewentualnie może zwracać tablicę z ustalonymi kluczami tak, żeby np zamiast klucza 9 była treść. Czy jest to możliwe?
Pawel_W
powywalaj nawiasy, to co jest między nimi zostaje zwrócone w wynikach, wystarczy że zostawisz ostatnią parę nawiasów i powinno być ok wink.gif
Mlodycompany
Że tak powiem - no i gitara. O to mi chodziło. Dzięki wielkie

A jeszcze mam drugie szybkie pytanie. Z tego co zwraca preg_match chciałbym wyciągnąć pewne rzeczy w ten sposób, że daje
Kod
Failed password for %user% from %ipAddr% port %port% ssh2
i mam w zmiennych kolejno user, ipAddr, port wartości z tego co zwraca preg_match. Zagmatwałem trochę ale myślę, że jest to zrozumiałe smile.gif
Pawel_W
str_replace, ew. sprintf (musiałbyś %user% zamienić na %s itd, wszystko jest w manualu)
Mlodycompany
chodzi mi zupełnie o co innego. Otóż np do funkcji daje 2 argumenty Failed password for bin from xx.xx.xx.xx port 39817 ssh2 i
Failed password for %user% from %ipAddr% port %port% ssh2
a ona tworzy mi zmienne $user $ipAddr $port z zawartością odpowiednio bin xx.xx.xx.xx 39817


Napisałem sobie taką funkcję. Gdyby komuś była potrzebna to ją tutaj umieszczam

  1. function getDataFromStr( $str, $pattern ) {
  2. preg_match_all( "/%(.*?)%/", $pattern, $a );
  3. preg_match( "/" . preg_replace( "/%(.*?)%/", "(.*?)", $pattern ) . "/", $str, $b );
  4. $a = $a[ 1 ];
  5. unset( $b[ 0 ] );
  6. $b = array_values( $b );
  7. foreach ( $a as $k => $v ) {
  8. global $$v;
  9. $$v = $b[ $k ];
  10. }
  11. }
  12.  
  13. getDataFromStr( "Dec 2 14:07:49 zzz sshd[10722]: Failed password for mayesto from xx.xx.xx.xx port 52345 ssh2", "Failed password for %user% from %ipAddr% port %port% ssh2" );
  14. var_dump( $user, $ipAddr, $port );


Kod
string(7) "mayesto"
string(11) "xx.xx.xx.xx"
string(5) "52345"
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.