Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyszukanie i pobranie danych ze stringa
Forum PHP.pl > Forum > Przedszkole
Fallout
Witam,

Natknąłem się na taki problem:

Pobieram z bazy tekst i muszę znaleść w nim wszystkie wystąpienia {%$zmienna%}
gdzie słowo "zmienna" może być dowolne.

I teraz chcę takie wystąpienie porównać z moją listą dopuszczonych "zmiennych"
i w przypadku gdy jest nieprawidłowe zostanie zastąpione słowem error. Dziwnie to brzmi więc napisze to tak:

1. pobieram tekst z bazy do zmiennej
2. wyszukuje wystapienia "{%...%}" (czyli zawartosci miedzy tymi nawiasami klamrowymi z procentem
3. w przypadku gdy zawartość jest inna niż dopuszczone zostaje tam wpisane $error
4. do pkt 2. aż do wyczerpania wystąpień.

dla przykładu:

{%$link%} jest pożądane więc przejdzie
{%$majtki%} nie ma na whiteliście więc zostanie zastąpione {%$error%}
{%cokolwiek_innego_wpisze%} to samo co wyżej.

tzn mam teoretyczne rozwiazanie

wyszukać pozycję {% i %}
pobrać zawartość spomiędzy nich
porównać
zamienić wartość

ale to tylko w teorii ładnie wygląda i dla sporego tekstu będzie strasznie ślamazarne a takich wywołań będzie sporo, jest jakiś normalny sposób na to??

pozdrawiam
UDAT
  1. <?php
  2. /**
  3. * Returns an array containing each of the sub-strings from text that
  4. * are between openingMarker and closingMarker. The text from 
  5. * openingMarker and closingMarker are not included in the result.
  6. * This function does not support nesting of markers.
  7. * @param string $text
  8. * @param string $openingMarker
  9. * @param string $closingMarker
  10. * @return string
  11. */
  12.  function returnSubstrings($text, $openingMarker, $closingMarker) {
  13. $openingMarkerLength = strlen($openingMarker);
  14. $closingMarkerLength = strlen($closingMarker);
  15.  
  16. $result = array();
  17. $position = 0;
  18.  
  19. while ( ( $position = strpos( $text, $openingMarker, $position ) ) !== false ) {
  20. $position += $openingMarkerLength;
  21.  
  22. if ( ( $closingMarkerPosition = strpos( $text, $closingMarker, $position ) ) !== false ) {
  23. $result[ ] = substr( $text, $position, $closingMarkerPosition - $position );
  24. $position = $closingMarkerPosition;
  25. }
  26. }
  27.  
  28. return $result;
  29. }
  30. ?>


Ten algorytm przejedzie cały tekst raz ( jak dobrze zaimplementujesz ), więc będzie szybki
Fallout
Dzięki, oto chodziło smile.gif
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.