Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Proba napisania wlasnego parsera
Forum PHP.pl > Forum > PHP
Diablos
  1. <?php
  2. $string = 'sadsad<!-- BEGIN users -->{$login} - {$haslo}<br><!-- END users -->';
  3.  
  4. $array = array( 
  5. 'users' => array( 
  6. array ('login' => 'Kamil',
  7.  'haslo' => 'asdsad'
  8. ), 
  9. array ('login' => 'Cyprian', ,
  10.  'haslo' => 'sadad'
  11. ) 
  12.  ),
  13. 'ksiega' => array( array ('author' => 'asdasd' ), array ('author' => 'asdasd2' ) ) );
  14. print_r($array);
  15.  
  16.  
  17.  
  18. foreach( $array as $section_key => $section )
  19. {
  20. $match = "#<!-- BEGIN $section_key -->(.*?)<!-- END $section_key -->#si";
  21. preg_match($match, $string, $matched);
  22. $result = '';
  23.  
  24. foreach ( $section as $zmienna )
  25. {
  26. foreach ( $zmienna as $wynik => $fack )
  27. {
  28. $cos = preg_replace('#{$' . $wynik . '}#si', $fack, $matched[0]);
  29. }
  30.  
  31. $result .= $cos;
  32. echo $cos;
  33. }
  34. }
  35. $string = preg_replace($match, $result, $string);
  36. echo $string;
  37. ?>


Tak przebiegaja moje przygotowania do napisania zgrabnego (?) ;p własnego systemu szablonow. W czym problem?
Chciałem aby obie zmienne w pliku z szablonem {$haslo} i {$login} zostaly zamienione ... na przypisane im wartosci. Poniewaz wartosci jest kilka kombinowalem z sekcjami i robilem petle.
Prawie działa z tym, ze:
w wyniku pracy powyzszego kodu zamiast:
Kod
Kamil - asdsad
Cyprian - sadad


otrzymuje:

Kod
{$login} - asdsad
{$login} - sadad


Kombinowalem juz sporo, nie wiem czemu nie chce dzialc poprawnie i gdzie jest blad.
dtb
  1. <?php
  2. $string = 'sadsad<!-- BEGIN users -->{$login} - {$haslo}<br><!-- END users -->';
  3.  
  4. $array = array( 
  5.   'users' => array( 
  6.         array ('login' => 'Kamil', 'haslo' => 'asdsad'), 
  7.         array ('login' => 'Cyprian', 'haslo' => 'sadad'),
  8.          ),
  9.   'ksiega' => array(
  10.         array ('author' => 'asdasd'),
  11.         array ('author' => 'asdasd2'),
  12.          ),
  13. );
  14.  
  15. foreach( $array as $section_key => $section )
  16. {
  17.     $match = "#<!-- BEGIN $section_key -->(.*?)<!-- END $section_key -->#si";
  18.     preg_match($match, $string, $matched);
  19.     $result = '';
  20.     foreach ( $section as $zmienna )
  21.     {    
  22.        $cos = &$matched[1]; // siła tkwi w referencjach
  23.        foreach ($zmienna as $k => $v)
  24.             $cos = str_ireplace ('{$'.$k.'}', $v, $cos);
  25.        $result .= $cos;
  26.     }
  27.     $string = str_ireplace($matched[0], $result, $string);
  28. }
  29. echo $string;
  30. ?>


popełniłeś klasyczny błąd. sprawdź to:
  1. <?php
  2. $str = ':) :-)';
  3. $nowytekst = str_replace (':)', ':(', $str);
  4. $nowytekst = str_repalce (':-)', ':-(', $str);
  5. echo $nowytekst;
  6. ?>

przeanalizuj kod i sprawdz dlaczego widzimy smile.gif :-( a nie sad.gif :-(

PS. nie stosuj wyrazen regularnych gdy nie sa konieczne [patrz kod]
Diablos
dtb:

dzieki twojemu rozwiazaniu otrzymuje:
Kod
sadsadKamil - asdsad
Kamil - asdsad


Nie do konca dziala jak trzeba :/

Dzieki za kilka cennych uwag.
FanFataL
Kawałek foreacha z $section zamieniłbym na taki:
  1. <?php
  2. // ...
  3. foreach ( $section as $zmienna )
  4. {
  5.  foreach ($zmienna as $k => $v) {
  6. $zmienna['{$'.$k.'}'] = $v;
  7. unset($zmienna[$k]);
  8. }
  9. $result .= strtr($matched[1], $zmienna);
  10. }
  11. // ...
  12. ?>

Pozdrawiam winksmiley.jpg
...
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.