Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Proba napisania wlasnego parsera
Diablos
post 18.01.2006, 15:26:54
Post #1





Grupa: Zarejestrowani
Postów: 165
Pomógł: 6
Dołączył: 17.06.2005

Ostrzeżenie: (0%)
-----


  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.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
dtb
post 18.01.2006, 20:40:34
Post #2





Grupa: Zarejestrowani
Postów: 476
Pomógł: 1
Dołączył: 5.11.2005
Skąd: Bieruń city

Ostrzeżenie: (0%)
-----


  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]

Ten post edytował dtb 18.01.2006, 20:57:01


--------------------
Go to the top of the page
+Quote Post
Diablos
post 18.01.2006, 22:52:56
Post #3





Grupa: Zarejestrowani
Postów: 165
Pomógł: 6
Dołączył: 17.06.2005

Ostrzeżenie: (0%)
-----


dtb:

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


Nie do konca dziala jak trzeba :/

Dzieki za kilka cennych uwag.
Go to the top of the page
+Quote Post
FanFataL
post 19.01.2006, 11:59:46
Post #4





Grupa: Przyjaciele php.pl
Postów: 13
Pomógł: 0
Dołączył: 6.09.2005
Skąd: Kraków / Katowice / Bydgoszcz

Ostrzeżenie: (0%)
-----


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
...


--------------------
The people who are trying to make this world worse are not taking a day off. How can I? - Light up the darkness
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 23.06.2025 - 13:16