Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] - Ulepszenie funkcji wyszukującej
Forum PHP.pl > Forum > Przedszkole
Adi32
Witajcie.

Zrobiłem sobie kiedyś funkcję, która przeszukuje wszystkie pliki z katalogu w którym się znajduje i podrzędne w poszukiwaniu danej frazy,
po czym zwraca url do pliku, linie i wiersz. Jest przeogromnie przydatna szczególnie gdy pracuje się z obcym kodem.

W pewnym projekcie zostały naniesione zmiany w bazie danych, konkretnie w tabeli `config`.

Stara struktura czyli
id | wartosc
1 | To jest tytuł strony //tytuł
2 | Bardzo fajna strona // opis (description)
itd.

Nowa struktura:
key | value
title | To jest tytul
itd.

Rekordów jest sporo, projekt też nie mały, a zadaniem jest teraz poodmieniać wszystkie każde użycie klasy config z:
Config::get(1)
na
Config::get('title')

Tak na prawdę to trzeba tylko znaleźć wszystkie użycia metody Config::get() gdzie parametrem jest INT i zamienić na $c->title, $c->description itd;

Ten problem nasunął mi pomysł nadpisania funkcji, na pewno przyda się jeszcze w innych przypadkach.

Chyba nie ma sensu wklejać całej funkcji szukającej...

  1. <?
  2. if (stripos(file_get_contents($sciezka . $plik), $szukany_ciag) !== false) {
  3.  
  4. if ($linie = @file($sciezka . $plik)) {
  5.  
  6. foreach ($linie as $linia => $tresc) {
  7.  
  8. if ($pozycja = stripos($tresc, $szukany_ciag)) {
  9.  
  10.  
  11. ?>
  12. <tr title="<?=htmlspecialchars(trim($tresc))?>">
  13. <td><?= $sciezka ?><strong><?= $plik ?></strong></td>
  14. <td><?= ($linia + 1) ?></td>
  15. <td><?= $pozycja ?></td>
  16. </tr>
  17. <?
  18. flush();
  19. }
  20. }
  21. }
  22. }
  23. ?>


Chciałbym móc użyj jej w mniej więcej taki sposób:

  1. Config->get(/[0-9]?/)


Czy istnieje możliwość wprowadzenie do PHPowej wyszukiwarki wyrażeń regularnych?
peter13135
Ale w czym konkretnie masz problem ?

Z tego co widzę, ten kawałek kodu szuka w której linii znaleziono "pociąg". Nie wiem jednak po co ten kod wkleiłeś... bo przecież Ciebie teraz to nie interesuje, po prostu chcesz zamienić pewien fragment kodu na inny fragment. Do tego możesz użyć preg_match().

A skoro masz strukturę plików (pewnie w jakiejś tablicy) to robisz pętlę i każdy plik traktujesz tą funkcją.

Mam wrażenie, że to co napisałem jest dla Ciebie oczywiste, więc może napiszesz dokładniej w czym problem ?
Adi32
Cytat(peter13135 @ 18.07.2012, 22:32:13 ) *
Ale w czym konkretnie masz problem ?

Z tego co widzę, ten kawałek kodu szuka w której linii znaleziono "pociąg". Nie wiem jednak po co ten kod wkleiłeś... bo przecież Ciebie teraz to nie interesuje, po prostu chcesz zamienić pewien fragment kodu na inny fragment. Do tego możesz użyć preg_match().

A skoro masz strukturę plików (pewnie w jakiejś tablicy) to robisz pętlę i każdy plik traktujesz tą funkcją.

Mam wrażenie, że to co napisałem jest dla Ciebie oczywiste, więc może napiszesz dokładniej w czym problem ?

Ano jest to oczywiste.
Mam wyszukiwarke, szuka w we wszystkich plikach PHP wpisanego ciągu. Chciałbym w tej wyszukiwarce uwzględnić wyrażenia regularne.
peter13135
No to wyrażenie regularne w Twoim przypadku może być takie :
  1. <?php
  2.  
  3. $str = '
  4. <?php
  5.  
  6. echo \'lubię placki\';
  7. Config::get(1);
  8. $trolololo = Config::get(2);;
  9. ?>
  10. ';
  11. preg_match_all('#(Config::get\(\d+\))#', $str, $matches);
  12.  
  13. print_r($matches);
  14. ?>
Adi32
Nie dokładnie o to chodziło, w każdym razie rozwiązanie było proste i funkcja działa doskonale.

Jeżeli ktoś byłby nią zainteresowany to mogę się podzielić.

Funkcjonalność to po prostu przeszukanie wszystkich plików na serwerze i ich zawartości w poszukiwaniu danej frazy z możliwością używania wyrażeń regularnych.
+ zabezpieczenie hasłem, ograniczenie do konkretnego rozszerzenie, sprecyzowanie miejsca wyszukiwania.
wNogachSpisz
Czy istnieje szczególny powód dla którego chcesz to robić z poziomu PHP?
Każdy szanujący się edytor tekstowy ma taką funkcję.
Adi32
Już wyjaśniam.

Jak napisałem wcześniej, przydaje się w przeszukiwaniu obcego kodu.
W mojej firmie jest przymus pracy z PsPadem, który nie posiada takich opcji.
Mimo wszystko korzystam z NetBeansa ale żeby przeszukiwać pliki na obcym serwerze muszę najpierw przeprowadzić integrację co trwa dość długo, jest bez sensu jeżeli trzeba zmienić jedną rzecz w jednym pliku, a co najgorsze NetBeans ma buga który przy takiej integracji losowo kasuje pliki na serwerze.
Dlatego czasami lepiej jest wrzucić na serwer jeden plik i odpalić.
irmidjusz
Cytat(Adi32 @ 19.07.2012, 12:10:10 ) *
W mojej firmie jest przymus pracy z PsPadem


?!?!?!?!?!?
niech mnie ktoś uszczypnie, bo chyba śnię...

owszem, uważam PSPad za super edytorek, znacznie lepszy od jakichkolwiek innych tego typu małych, podręcznych programików (bije notatnik++ na głowę), szczególnie z uwagi na dostępność mnóstwa gotowych, świetnych rozszerzeń do niego i możliwość łatwego pisania własnych w javascript albo visual basicu,

ale

Cytat(Adi32 @ 19.07.2012, 12:10:10 ) *
W mojej firmie jest przymus pracy z PsPadem


WTF!? biggrin.gif
redeemer
Jeżeli zdalny serwer o którym piszesz stoi na Linuksie albo innym w miarę zgodnym z POSIX i masz dostęp przez ssh to możesz użyc dostępnych tam narzędzi, które będą wydajniejsze od skryptu PHP. Zresztą, jak możecie mieć coś na zdalnym serwerze a nie mieć tego lokalnie? Jak się wysypie wam serwer razem z backupem (zakładając, że macie takowy), to co? Klepanie od nowa?
Adi32
Cytat(redeemer @ 19.07.2012, 18:54:41 ) *
Jeżeli zdalny serwer o którym piszesz stoi na Linuksie albo innym w miarę zgodnym z POSIX i masz dostęp przez ssh to możesz użyc dostępnych tam narzędzi, które będą wydajniejsze od skryptu PHP. Zresztą, jak możecie mieć coś na zdalnym serwerze a nie mieć tego lokalnie? Jak się wysypie wam serwer razem z backupem (zakładając, że macie takowy), to co? Klepanie od nowa?

Nie mi to trzeba tłumaczyć... A co do wydajności to też nie narzekam, skrypt nigdy nie szukał dłużej niż kilka sekund.
d3ut3r
Trochę offtopując, ktoś wspomniał o Bugu w NB kasującym pliki przy synchronizacji. Jest gdzieś to na bug tracku ? bo kurcze ostatnio mi poginęły pliki projektu i się zastanawiałem gdzie leży problem smile.gif

Co do samego tematu, narzędzie jak narzędzie jednym się przyda innym nie. Oczywiście fajnie jest mieć dostęp przez ssh jednak nie zawsze jest to możliwe. Z drugiej strony brak kopii lokalnej może być przyczyną ekstremalnych przygód smile.gif (jak @redeemer wspomniał, padnięcie serwera i po projekcie).
Adi32
Było gdzieś coś, nawet pisali, że w nowej wersji buga już nie ma. Ale to nie prawda, NB i tak kasuje pliki.
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.