Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Wyciąganie ciągu znaków z pliku tekstowego
Forum PHP.pl > Forum > Przedszkole
php__amator
Witam serdecznie,

Znalazłem sposób na odczytanie (pośrednio) ip serwera do którego jest utrudniony dostęp (problem polega na tym, że operator zmienia adres IP na z zupełnie innej paczki za każdym razem gdy wystąpi jakiś problem i router zostanie zresetowany).

Jednak wpadłem na pomysł jak się dowiedzieć jaki jest nowy adres, to proste. Ponieważ istnieje połączenie serwera via TeamViewer (choć nie mogę się podłączyć z powodu - NIEZNANY) mogę wyczytać IP z logów smile.gif Juppi

W związku z tym żeby ułatwić sobie odszukiwanie w w/w i nie grzebać się w liście składającej się z setek linii potrzebuję skryptu do wyszukiwania ciągu znaków.
Skrypt wyszukuje mi frazę ale ja potrzebuję aby pokazał mi nie tę frazę tylko to co znajduje się tuż za nią.

  1.  
  2. $szukana_fraza = 'GWT.CmdUDPPing.PunchReceived, a=';
  3.  
  4. //$dodatek = 'Ciąg znaków, na który zamieniamy';
  5.  
  6. $input = file('TeamViewer8_Logfile.txt'); // plik wejściowy
  7. $output = array();
  8.  
  9. foreach ($input as $linia)
  10. {
  11. $linia = trim($linia);
  12.  
  13. if (strpos(strtolower($linia), strtolower($szukana_fraza)) !== FALSE)
  14. $linia .= $szukana_fraza;
  15.  
  16. $output[] = $linia;
  17. }
  18.  
  19. echo $linia;


Rzućcie okiem i podpowiedzcie czy to zadziała i jak spowodować żeby pokazało mi kolejnych 15 znaków występujących po wskazanym ciągu.
werdan
Pakujesz wszystkie znalezione linie do $output, a i tak wyświetlasz ostatnią linie (nawet jak nie ma w niej szukanego tekstu)

Poczytaj o preg_match.

Jak ci sie nie uda, to wklej pare lini tego loga.

PS. Tam wogole jest cos zle. Dodajesz do linii, szukany string, potem to wszystko do tablicy i na koniec drukujesz ostatnia linie.
php__amator
Zauważyłem, że jakąś bzdure zrobiłem ale to pewnie dlatego, że moje pojęcie w dalszym ciągu jest ..... niewielkie smile.gif

Hej,
Próbowałem co nieco zmienić w skrypcie ale nie bardzo wiem jak zbudować poprawnie mechanizm porównywania ciągów.
Powiedzmy, że potrafię to zrobić ze zmiennymi ale w tym przypadku .... nie wiem.
Jeśli już go znajde to jak zmusić go do pokazania 15 znaków które następują po wyszukiwanym ciągu ?
A może jest opcja która w prostszy sposób pozwoli na wyszukanie adresu ip z całości tekstu ?

Oto fragment logu:
[txt]
2013/11/17 13:18:29.140 2156 5660 S0 CT78 GWT.InitUDPPingVersionHandshake
2013/11/17 13:18:29.456 2156 5172 S0 Encryption confirmed by partner
2013/11/17 13:18:29.590 2156 5660 S0 CT78 GWT.UDPFlowVersionHandshakeResponse.Received
2013/11/17 13:18:29.590 2156 5660 S0 CT78 Activating UDP packet loss control ...
2013/11/17 13:18:29.590 2156 5660 S0 CT78 GWT.UDPFlowVersionHandshakeResponse.InitUDP2
2013/11/17 13:18:29.590 2156 5660 S0 CT78 GWT.SendUDPPings
2013/11/17 13:18:29.886 2156 5172 S0 CT77 CT.Receive.CMD_MEETING_AUTHENTICATION From=222966547 To=415060225 L=53
2013/11/17 13:18:29.886 2156 5172 S0 CGatewaySession::ReceivedCmdMeetingAuthentication: CC=8 CT=9
2013/11/17 13:18:30.148 2156 5660 S0 CT78 GWT.CmdUDPPing.UDPMasterReply 86.25.26.65:59542
2013/11/17 13:18:30.148 2156 5660 S0 CT78 GWT.CmdUDPPing.PingOK.RequestUDP
2013/11/17 13:18:30.750 2156 5172 S0 CT77 CT.Receive.CMD_MEETING_AUTHENTICATION From=222966547 To=415060225 L=53
2013/11/17 13:18:30.750 2156 5172 S0 CGatewaySession::ReceivedCmdMeetingAuthentication: CC=8 CT=9
2013/11/17 13:18:30.812 2156 5660 S0 CT78 GWT.SendUDPPunches
2013/11/17 13:18:30.812 2156 5660 S0 CT78 punching version 0, type 2
2013/11/17 13:18:30.822 2156 5660 S0 CT78 GWT.SendUDPPunchRequest 3
2013/11/17 13:18:30.913 2156 5660 S0 CT78 GWT.CmdUDPPing.PunchReceived, a=86.129.191.236, p=34517
2013/11/17 13:18:30.913 2156 5660 S0 CT78 GWT.SendUDPPunches
2013/11/17 13:18:30.913 2156 5660 S0 CT78 punching version 0, type 0
2013/11/17 13:18:30.967 2156 5660 S0 CT78 GWT.UDPFlowPunchReceived.Received
2013/11/17 13:18:30.968 2156 5660 S0! CT78 GWT.CmdUDPPing.PunchIgnored state=4
2013/11/17 13:18:31.061 2156 5660 S0 CT78 GWT.CmdUDPPing.MTUReceived
2013/11/17 13:18:31.072 2156 5660 S0 CT78 GWT.CmdUDPPing.MTUReceived
2013/11/17 13:18:31.173 2156 3564 S0 CT78 GWT.UDPFlowMTUReceived.Received
2013/11/17 13:18:31.173 2156 3564 S0 CT78 GWT.UDPFlowMTUReceived.Received
2013/11/17 13:18:31.273 2156 5660 S0 CT78 GWT.UDPFlowUDPSendPossible.Received
2013/11/17 13:18:31.273 2156 5660 S0 CT78 GWT.UDPFlowUDPSendPossible.PrepareSwitchToUDP.Send2
2013/11/17 13:18:31.273 2156 5660 S0 CT78 GWT.UDPFlowUDPSendPossible.Received
2013/11/17 13:18:31.435 2156 5172 S0 CT77 CT.Receive.CMD_CARRIER_SWITCH From=222966547 To=415060225 L=12
2013/11/17 13:18:31.435 2156 3564 S0 GWS.ProcessCarrierSwitch: state=2, carrier=2
2013/11/17 13:18:31.435 2156 3564 S0 CT78 CT.ProcessCarrierSwitchFinished
2013/11/17 13:18:31.435 2156 3564 S0 CT78 Activating UDP carrier ...
2013/11/17 13:18:39.663 5316 6916 H64 explorer.exe: dll can unload now
[/txt]

pogrubiony tekst to szukany fragment, adres ip znjaduje sie tuż za nim.
Help help
werdan
  1. <?php
  2. $szukana_fraza = 'GWT.CmdUDPPing.PunchReceived, a=';
  3.  
  4. $input = file('TeamViewer8_Logfile.txt'); // plik wejściowy
  5. $output = array();
  6.  
  7. foreach ($input as $linia)
  8. {
  9. $linia = trim($linia);
  10.  
  11. if (strpos(strtolower($linia), strtolower($szukana_fraza)) !== FALSE){
  12. preg_match("/GWT.CmdUDPPing.PunchReceived, a=(.*?), p/", $linia, $matches);
  13. $output[] = $matches[1];
  14. }
  15.  
  16. }
  17.  
  18. print_r($output);
  19.  
  20. ?>


W $output otrzymujesz tablice wszystkich adresów IP wystepujacych w linii z szukanym tekstem, aby wziac ostatni uzyj
  1. echo end($output);
php__amator
Dzięki serdeczne werdan,
Zaoszczędziłeś mi spoooooooro czasu i przy okazji pokazałeś jak to zrobić smile.gif
Wielkie dzięki

Zrobiłem jak zaleciłeś i zdecydowanie wole jak pokazuje zamiast listy tylko ostatni znaleziony adres.
Oczywiscie nie zostawiłemtego w takiej formie bo nie byłbym sobą jak bym czegoś nie pozmieniał smile.gif
Dodałem więc pętlę żeby wyświetlało mi poszczególne elementy tablicy w kolumnie smile.gif

Super dzięki
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.