Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Wyszukiwanie w ciągu danej wartości
Forum PHP.pl > Forum > Przedszkole
Monter08
Witam!
Szukam funkcje która wyszuka w ciągu wartość od-do. Przykład - mam bardzo długi ciąg (powiedzmy że są to ustawiania w jakimś pliku)
"Tytuł=bla bla bla bla
Nazwa=blablablabla
Język=Polski"
i chciałbym otrzymać zawartość powiedzmy Nazwy czyli od "Nazwa=" do \n czyli przejścia do nowej linii.
Przepraszam, że opisałem to jak kali jeść kali pić ale inaczej tego opisać nie potrafię smile.gif
Za pomoc z góry dziękuje.
Pozdrawiam, Monter08
peter13135
jeśli twój plik zawsze będzie miał zawartość typu
Kod
a=1
b=2
c=lala


to otwórz ten plik za pomocą file() - ta funkcja zapisze Ci tekst do tablicy, której elementy będą liniami/wierszami pliku tekstowego.
następnie użyj explode ro rozbicia ciągu
np. explode('=', 'a=5')
zwróci Ci tablicę 2-elementową, której element o ideksie 0 będzie miał wartość "a", a element o indeksie 1 będzie miał wartość "5"
Monter08
Właśnie mój skrypt się na tym opiera, lecz jeżeli przyjdzie jakiś użytkownik i wstawi "Nazwa=ble=ble" to już wszystko idzie na marne, dlatego nie chce robić to explode tylko jakąś funkcją co odnajdzie mi wartość od do. Próbowałem preg_match ale jakoś mi nie wychodzi, zapewne źle wpisuje składnie.
peter13135
a czy user może dać znak nowej linii ?
jeśli nie, to po prostu scal wszystkie elementy tablicy, oprócz elementu z indexem 0. Możesz do tego użyć implode, albo nawet zwykłej pętli.
Monter08
Może dodać.. Czekam na dalsze pomysły, zastanawia mnie użycie funkcji preg_match potrafi ktoś ją dobrze złożyć, aby przeszukiwała "Nazwa= \n"?
morbic
  1. $test = explode('=', 'nazwa=ble=ble', 2);
  2. print_r($test);
Monter08
Cytat(morbic @ 17.07.2011, 18:55:22 ) *
  1. $test = explode('=', 'nazwa=ble=ble', 2);
  2. print_r($test);

Przecież pisałem że explode odpada..
morbic
Widziałem. Ale przetestuj ten przykład. I zwróć uwagę na ostatni, trzeci parametr explode()
Monter08
Wybacz morobic, nie zauważyłem smile.gif Twoje rozwiązanie jest bardzo dobre, lecz nadal poszukuje tej funkcji, ponieważ sprawa wygląda tak:
użytkownik loguje się, klika konfiguracja i w tej chwili poleceniem "cat plik grep nazwa" pobieram sobie zawartość nazwy i łamie to na dwie części przez explode, lecz tych opcji jest bardzo dużo i trochę to zajmuje i trochę to rozbiłem bo czasami polecenie cat znajduje dwie możliwości i muszę je także rozbijać i to też zajmuje. Dlatego właśnie szukam polecenia które gdy pobiore sobie cały plik konfiguracyjny przeszuka mi go i wyświetli zawartość.Na pewno mniej to będzie zajmować i lepiej się sprawować, wiec jeżeli ktoś mógłby mi pomóc podając tą funkcje byłbym szczęśliwy i jakoś to by wyglądało..
morbic
Wywołujesz "cat plik | grep nazwa" z poziomu PHP? Jeśli tak, to niepotrzebnie utrudniasz sobie życie.

Najlepiej podaj format danych (pliku konfiguracyjnego), jaki masz i podaj przykład, w jakiej formie chciałbyś te dane dostać. Będzie łatwiej nakierować i zrozumieć, bo mam wrażenie, że idziesz z Katowic do Krakowa przez Moskwę.
Monter08
ehh.. przecież napisałem to tylko, dlatego żeby pokazać, że to nie jest dobry pomysł.. Polecenie wysyłam przez ssh2 do maszyny.. i właśnie dlatego chcę zastąpić tą metodę, ponieważ tych poleceń wysyłam 8 i to trochę trwa.. Widzę, że się nie rozumiemy..
morbic
Najłatwiej się zrozumiemy, jeśli wrzucisz kod, który masz obecnie. Zobaczymy jak da się to zrobić prościej smile.gif
Monter08
ehh.. nie wiem po co, proszę tylko o jedną funkcje, ale proszę bardzo..
  1. $stream[0] = ssh2_exec($connection, "cat $ssh_dir/$user_name/ventrilo_srv.ini | grep Name");
  2. $stream[1] = ssh2_exec($connection, "cat $ssh_dir/$user_name/ventrilo_srv.ini | grep Comment");
  3. $stream[3] = ssh2_exec($connection, "cat $ssh_dir/$user_name/ventrilo_srv.ini | grep Password");
  4. $stream[4] = ssh2_exec($connection, "cat $ssh_dir/$user_name/ventrilo_srv.ini | grep Auth");
  5. $stream[5] = ssh2_exec($connection, "cat $ssh_dir/$user_name/ventrilo_srv.ini | grep VoiceFormat");
  6. $stream[6] = ssh2_exec($connection, "cat $ssh_dir/$user_name/ventrilo_srv.ini | grep AdminPassword");
  7. $stream[7] = ssh2_exec($connection, "cat $ssh_dir/$user_name/ventrilo_srv.ini | grep Duplicates");
  8.  
  9. stream_set_blocking($stream[0], true);
  10. stream_set_blocking($stream[1], true);
  11. stream_set_blocking($stream[3], true);
  12. stream_set_blocking($stream[4], true);
  13. stream_set_blocking($stream[5], true);
  14. stream_set_blocking($stream[6], true);
  15. stream_set_blocking($stream[7], true);
  16. $pName=stream_get_contents($stream[0]);
  17. $pComment=explode("\n", stream_get_contents($stream[1]));
  18. $pPasswordall=explode("\n", stream_get_contents($stream[3]));
  19. $pPasswordAdmin=explode("=", stream_get_contents($stream[6]));
  20. $pPassword=explode("=", $pPasswordall[1]);
  21. $pAuth=explode("=", stream_get_contents($stream[4]));
  22. $pFormat=explode("=", stream_get_contents($stream[5]));
  23. $pDup=explode("=", stream_get_contents($stream[7]));

odpowiada to za pobranie wartości, wszystkie nie wkleiłem (jeżeli ktoś by chciał się przyczepić) powiem tylko, że całość działa.
Crozin
Zawsze gdy wymyślasz jakieś nowe "narzędzie" (tutaj format pliku) zastanów się czy to w ogóle ma sens. Czy nie lepiej skorzystać z XML-a albo SQLite? Napisz do czego i jak będziesz to wykorzystywał i jeżeli w gotowym narzędziu nie znajdziesz jakiś barier nie do przejścia nawet nie trudź się w wymyślaniu własnego - nie warto.
Monter08
cała moja aplikacja to panel do obsługi serwerów głosowych (aktualnie pisze część ventrilo), więc trudno jest mi zmieniać cały program odpowiadający za klienta do własnej woli, wręcz jest to nie możliwe.
morbic
Własny format tu odpada, ograniczenie configiem ventrilo. Ale teraz już rozumiem o co chodzi.

  1. $Config = Array();
  2.  
  3. $stream = ssh2_exec($connection, "cat $ssh_dir/$user_name/ventrilo_srv.ini");
  4.  
  5. stream_set_blocking($stream, true);
  6. $conf = explode("\n", stream_get_contents($stream));
  7.  
  8. foreach ($conf as $line) {
  9. $line = explode('=', $line, 2);
  10. if (count($line) != 2) continue; // Zabezpieczenie dla linii nie będących w formacie nazwa=wartosc
  11. $Config[$line[0]] = $line[1];
  12. }
  13.  
  14. print_r($Config);


O to chodziło?
Monter08
hmm, morbic Dzięki! biggrin.gif wgl o tym nie pomyślałem, wstawię to u siebie u dam znać jak będzie działać smile.gif
//btw, lepszym rozwiązaniem jest wykorzystanie sftp niż pobrać to catem smile.gif
morbic
Cytat(Monter08 @ 17.07.2011, 23:00:40 ) *
//btw, lepszym rozwiązaniem jest wykorzystanie sftp niż pobrać to catem smile.gif


Zdecydowanie, ale nie o to pytałeś, więc nie chciałem mieszać za bardzo wink.gif No problem!
Crozin
ventrilo_srv.ini - skoro to plik INI to dlaczego nie skorzystasz z parse_ini_file?
Monter08
Crozin - próbowałem, lecz mam mały problem z wyświetleniem danych, ponieważ otrzymuje coś takiego:
  1. Warning: parse_ini_file([Server] Name=Name=u Montera2 Phonetic=Server 1 Comment=Comment=Comment=Hello22 Port=3784 Auth=1 Duplicates=1 AdminPassword=3123134 Password=2 MaxClients=32 SendBuffer=0 RecvBuffer=0 Diag=0 LogonTimeout=5 CloseStd=1 FilterWave=0 FilterTTS=0 TimeStamp=0 PingRate=10 ExtraBuffer=0 ChanWidth=0 ChanDepth=0 ChanClients=0 DisableMaxClients=1 DisableQuit=1 VoiceCodec=0 VoiceFormat=1 SilentLobby=0 #SpamChat=1,1000,2 #SpamComment=Comment=Comment=Comment=Hello22=Hello=2=1,1000,2 #SpamWave=1,1000,2 #SpamTTS=1,10 [Intf] # Examples: # # Intf=192.168.0.30 # Intf=external.mydomain.com # Intf=internal.mydomain.com # Intf=127.0.0.1 [Status] # Examples: # Intf=0.0.0.0 # Intf=127.0.0.1 # Intf=external.mydomain.com #Password= #ReplyInterval=500 #FilterGen=127.0.0.1 # FilterGen=192.168.0.0/16 #FilterDetail=127.0.0.1 # FilterDetail=10.0.0.0/8 ) [function.parse-ini-file]: failed to open stream: File name too long in /home/monter/public_html/panel/5.php on line 16
  2. Array ( )

  1. $stream = fopen("ssh2.sftp://$sftp/home/monter/serv/my/ventrilo_srv.ini", 'r');
  2. stream_set_blocking($stream, true);
  3. $dane=stream_get_contents($stream);
Crozin
Format INI nie jest zbyt dobrze udokumentowany stąd też często pojawiają się pewne rozbieżności w formacie plików INI. Tutaj najprawdopodobniej wystarczyłoby objąć wartość zawierającą znaki specjalne (np. "=") w cudzysłów.

Jeżeli masz taką możliwość to dodaje te cudzysłowy - parse_ini_file da wtedy radę to odczytać. Jeżeli nie masz takiej możliwości napisz / dostosuj normalny parser. Rozwiązanie jakie podrzucił @morbic da radę wyłącznie w przypadku najprostszych plików INI. Niech Ci się tam trafią chociażby komentarze, sekcje, znaki ucieczki - polegnie.
Monter08
Przed wysłaniem danych wszystko przechodzi przesz addslashes i znaki specjalne nie wchodzą w grę, gdy występuje komentarz to po prostu go nie zapisuje. Zastanawiam się czy to na dobre wyjdzie czy na złe closedeyes.gif
morbic
Do parse_ini_file() dajesz nazwę pliku, nie jego zawartość. Musisz najpierw zapisać plik na dysk, a później jego nazwę przekazać do parse_ini_file().
Monter08
Dlatego dla mnie jest to opcja nie opłacalna, powiedzmy mamy 1k użytkowników i trochę by tych plików ciągłe je pobieranie..
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-2024 Invision Power Services, Inc.