Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dlaczego preg_replace nie podmienia?
Forum PHP.pl > Forum > PHP
deirathe
  1. <?php
  2. class template{
  3.  
  4. private $file;
  5. public $tpl;
  6. public $vars;
  7. public $queries;
  8.  
  9.  
  10. public function __construct($file){
  11. if(!file_exists($file)) exit("Plik $file nie istnieje");
  12. $this->file = $file;
  13. $this->tpl = fread(fopen($this->file,r),filesize($this->file));
  14. }
  15. public function put($var_name,$var_value){
  16. if(!$var_name) exit("W przekazywanej wartości nie została podana nazwa");
  17. $this->vars[$var_name] = $var_value;
  18. }
  19.  
  20. public function getVar($var_name){
  21. echo $var_name;
  22. return $this->vars[$var_name];
  23. }
  24. public function parse(){
  25. preg_match_all('/<template.*>[w|W]*</template>/U',$this->tpl,$this->queries);
  26. echo preg_replace('/<template.*>(w+)</template>/U',$this->vars["$1"],$this->tpl);
  27. }
  28.  
  29.  
  30.  
  31. }
  32. ?>

mam taką klasę (jak powyżej)- w sumie to jest dopiero początek klasy. Problem tkwi w tym, ęe preg_replace nie podminenia mi zmiennych z obiektu utworzonego z tej klasy na tekst znajdujący się pomiędzy znacznikami template w tym oto templaku:
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />
  4. <title>Untitled Document</title>
  5. </head>
  6.  
  7. <template action="loop">nazwa</template>
  8. <template action="show">nazwa2</template>
  9.  
  10. </body>
  11. </html>

Kod który tworzy obiekt i dodaje zmienne:
  1. <?php
  2.  
  3. require_once("template.class.php");
  4.  
  5.  
  6.  
  7. $tpl = new template("tpls/file.tpl");
  8.  
  9. $tpl->put("nazwa","moja nazwa");
  10. $tpl->put("nazwa2","moja nazwa2");
  11. $tpl->parse();
  12.  
  13.  
  14.  
  15.  
  16. ?>

Jakieś idee?
P.S. nie patrzcie na te błędne slashe forum je samo dodało

Ktokolwiek może pomóc?
sticker
hmm zastanawiam sie na pierwszy rzut wyglada ok, wkleiłem kod bo moze jakis gupi warning a tu faktycznie coś jest nie tak jakby nie potrafił evalować tablicy na podstawie zmiennej z prega

poradziłem sobie z tym w taki dość kupowaty sposób:

  1. <?php
  2. class template{
  3.  
  4. private $file;
  5. public $tpl;
  6. public static $vars;
  7. public $queries;
  8.  
  9.  
  10. public function __construct($file){
  11. if(!file_exists($file)) exit("Plik $file nie istnieje");
  12. $this->file = $file;
  13. $this->tpl = fread(fopen($this->file,r),filesize($this->file));
  14. }
  15. public static function put($var_name,$var_value){
  16. if(!$var_name) exit("W przekazywanej wartości nie została podana nazwa");
  17. self::$vars[$var_name] = $var_value;
  18. }
  19.  
  20. public static function getVar($var_name){
  21. echo $var_name;
  22. return self::$vars[$var_name];
  23. }
  24. public function parse(){
  25.  echo preg_replace_callback('/<template.*>([a-zA-Z0-9]+)</template>/U','funkcjaaa',$this->tpl);
  26. }
  27. }
  28. function funkcjaaa($matches){
  29. return template::getVar($matches[1]);
  30. }
  31. $tpl = new template("cos.tpl");
  32.  
  33. template::put("nazwa","moja nazwa");
  34. template::put("nazwa1","moja nazwa2");
  35. $tpl->parse();
  36. ?>


niestety troche mnie martwi koniecznosc wykorzystania funkcji statycznych dla klasy bo w callbackach nie mozna sie odwoływać do wskaźnika this chyba żeby sie udało ją zrobić jakoś wewnątrz klasy callbacka Ma ktoś jakiegoś pomysła ?
deirathe
No właśnie czekając tę jakże niezmiernie długie chwile rozwiązałem problem sam :]
  1. <?php
  2. class template{
  3.  
  4. private $file;
  5. public $tpl;
  6. public $vars;
  7.  
  8.  
  9.  
  10. public function __construct($file){
  11. if(!file_exists($file)) exit("Plik $file nie istnieje");
  12. $this->file = $file;
  13. $this->tpl = fread(fopen($this->file,r),filesize($this->file));
  14. }
  15. public function put($var_name,$var_value){
  16. if(!$var_name) exit("W przekazywanej wartości nie została podana nazwa");
  17. $this->vars[$var_name] = $var_value;
  18. }
  19. public function parse(){
  20. echo preg_replace('/<template.*>(w+)</template>/Ue','$this->vars["$1"]',$this->tpl);
  21.  
  22. echo"<pre>";
  23. print_r($res);
  24. }
  25.  
  26.  
  27.  
  28. }
  29. ?>

Trzeba było zmienna tablicowa wrzucić w cudzysłów pojedynczy i dodać do patterna modyfikator e żeby php wiedziało że nie ma wyświetlać string tylko ma się odwołać do zmiennej- wg mnie twórcy php tu troche nagmatwali dry.gif

p.s. znow jakies slashe w kodzie sie same dodaly;/
sticker
hmm probowałem tak jak ty masz i nie działa u mnie :|
edit: i nadal nie działa nic nie zamienia zostaje orginał
deirathe
:/ dziwne bo u mnie działa poprawnie- typowy tekst każdego informatyka tongue.gif
Jeszcze raz podaje kod:
index.php:
  1. <?php
  2.  
  3. require_once("template.class.php");
  4.  
  5.  
  6.  
  7. $tpl = new template("tpls/file.tpl");
  8.  
  9. $tpl->put("nazwa","moja nazwa");
  10. $tpl->put("nazwa2","moja nazwa2");
  11. $tpl->parse();
  12.  
  13.  
  14. ?>

tpl:
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />
  4. <title>Untitled Document</title>
  5. </head>
  6.  
  7. <template action="loop" >nazwa</template>
  8. <template action="show" >nazwa2</template>
  9.  
  10. </body>
  11. </html>

template.class.php
  1. <?php
  2. class template{
  3.  
  4. private $file;
  5. public $tpl;
  6. public $vars;
  7.  
  8.  
  9.  
  10. public function __construct($file){
  11. if(!file_exists($file)) exit("Plik $file nie istnieje");
  12. $this->file = $file;
  13. $this->tpl = fread(fopen($this->file,r),filesize($this->file));
  14. }
  15. public function put($var_name,$var_value){
  16. if(!$var_name) exit("W przekazywanej wartości nie została podana nazwa");
  17. $this->vars[$var_name] = $var_value;
  18. }
  19. public function parse(){
  20. echo preg_replace('/<template.*>(w+)</template>/Ue','$this->vars["$1"]',$this->tpl);
  21. //preg_match_all('/<template(( *)|(w="w"))*>(w+)</template>/i',$this->tpl,$res);
  22. //echo $this->tpl;
  23. }
  24.  
  25.  
  26.  
  27. }
  28. ?>
sticker
to nie wiem smile.gif jak działa to działa i dobrze :]
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.