Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> preg_replace, HELP ME !!!!!!!!!!!!
Apo
post
Post #1





Grupa: Zarejestrowani
Postów: 426
Pomógł: 1
Dołączył: 2.10.2005

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


Witam
Zaczełem pisac swoją nową klase pagera i natrafiłem na problem. Przy wyświetlaniu danych. Wygląd(template) danej rzeczy na stronie wczytuje z pliku przez file_get_contents. Przykładowy szablon wygląda tak:
  1. <?php
  2. <h2>{tytul}</h2><br /><br />
  3. TRESC: {tresc}.
  4. ?>


No i jak widać dane między {} zostaną zamienione na odpowiednie dane podane w skrypcie. Odpowiada za to metoda parse:

  1. <?php
  2. public function parse()
  3.   {
  4.   $this->parsed = '';
  5.   foreach($this->blocks as $what => $on)
  6.     {
  7.       $this->parsed .= preg_replace('#{'.$what.'}#', $on, $this->template); // tu jest pewnie źle
  8.     }
  9.   return $this->parsed;
  10.   }?>

No i $this->blocks jest tablica zawierająca elementy do podmiany. np:
  1. <?php
  2. $pager->blocks = array('co podminic' => 'na co');
  3. ?>

Skryptu używam tak:
  1. <?php
  2. $pager = New Pager($ile, 2);
  3. while($array = mysql_fetch_array($query, MYSQL_ASSOC))
  4. {
  5. $pager->load('text'); // ładuje plik do zmiennej
  6. $pager->blocks = array('tytul' => $array['tytul'], 'tresc' => $array['tresc']); //tablica do podmiany
  7. }
  8. $pager->parse();
  9. echo $pager->parsed;
  10. ?>


No i chodzi o to że preg_replace źle działa bo wygląd po parsowaniu wygląda tak:
  1. <?php
  2. to jest tytul newsa
  3.  
  4.  
  5. TRESC: {tresc}.
  6. {tytul}
  7.  
  8.  
  9. TRESC: to jest tresc newsa
  10. ?>


A powinien tak:
  1. <?php
  2. to jest tytul newsa
  3.  
  4. TRESC: to jest tresc newsa
  5. ?>

Więc zastają znaczniki {} które powinny zostac zamienione (IMG:http://forum.php.pl/style_emoticons/default/sad.gif)

Ten post edytował Apo 21.02.2006, 15:04:32
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
strife
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 2 605
Pomógł: 96
Dołączył: 22.10.2004
Skąd: UK

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


Zapomniałeś o slashu, { i } są traktowane jako znaki specjalne. Spróbuj tak:
  1. <?php
  2. // ...
  3. $this->parsed .= preg_replace("#\{".$what."\}#", $on, $this->template); 
  4. ?>


Tak myślę, ( bo wyrażeń reg. nie lubię ).

Pozdrawiam!

ps. powinno być rzeczy!
Go to the top of the page
+Quote Post
Apo
post
Post #3





Grupa: Zarejestrowani
Postów: 426
Pomógł: 1
Dołączył: 2.10.2005

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


niestety strife wcześniej też tak zrobiłem i to nic nie daje ;/ może trzeba dać jakąś flage ale ja sie na tym nie znam

Ten post edytował Apo 19.02.2006, 19:25:52
Go to the top of the page
+Quote Post
strife
post
Post #4





Grupa: Przyjaciele php.pl
Postów: 2 605
Pomógł: 96
Dołączył: 22.10.2004
Skąd: UK

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


Tak więc już wiem napewno, że preg_replace jest dobrze napisane, błąd musi być gdzieś indziej, ponieważ coś takiego:
  1. <?php
  2.  
  3. $string = "Tra la la Ala ma kota {var1} a tutaj kolejna zmienna {var2}";
  4.  
  5. $var     = 'var1';
  6. $wartosc = '<b>udalo sie</b>';
  7. $change = preg_replace("#{" . $var . "}#", $wartosc, $string );
  8.  
  9. echo $change;
  10.  
  11. ?>

działa. Jak coś wymyślę to zedytuje. Trzeba będzie się wczytać w Twój kod ;p


Hmm... nowe elementy do tablicy powinieneś chyba dodawać w ten sposób:
  1. <?php
  2. $pager->blocks[] = array('co podminic' => 'na co');
  3. ?>

a nie tak jak pisałeś
  1. <?php
  2. $pager->blocks = array('co podminic' => 'na co');
  3. ?>

Ponieważ cały czas zmieniasz tablicę na kolejną inną a nie dodajesz. ?
Go to the top of the page
+Quote Post
Termit_
post
Post #5





Grupa: Zarejestrowani
Postów: 44
Pomógł: 0
Dołączył: 11.06.2005
Skąd: Gostyń

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


Kod
$this->parsed .= preg_replace('#{'.$what.'}#', $on, $this->template);

Hmm.. a czemu tu jest operator dopisania (.=)?
Go to the top of the page
+Quote Post
Apo
post
Post #6





Grupa: Zarejestrowani
Postów: 426
Pomógł: 1
Dołączył: 2.10.2005

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


Sorry że tak późno odpisuje ale nie miałem dostępu do komputera, problem jest nadal aktualny.

Cytat
Hmm... nowe elementy do tablicy powinieneś chyba dodawać w ten sposób:
<?php
$pager->blocks[] = array('co podminic' => 'na co');
?>

Właśnie jak chce tak robic to mi wywala errory.

@Termit_ jak nie daje operatora przypisanie to jest taki efekt:

  1. <?php
  2. {tytul}
  3.  
  4.  
  5. TRESC: to jest tresc newsa.
  6. ?>


No i nie podmienia tego {tytul} bo go nie dopisze do zmiennej.
Go to the top of the page
+Quote Post
Jabol
post
Post #7





Grupa: Przyjaciele php.pl
Postów: 1 467
Pomógł: 13
Dołączył: 22.02.2003

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


@Abo: zwróć jeszcze raz na ostatnią uwagę strife'a - tam leży błąd.
Go to the top of the page
+Quote Post
Apo
post
Post #8





Grupa: Zarejestrowani
Postów: 426
Pomógł: 1
Dołączył: 2.10.2005

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


@Jabol wlasnie jak dodaje $pager->blocks[] = ... to mi wyskakuje błąd:
Warning: preg_replace() [function.preg-replace]: Parameter mismatch, pattern is a string while replacement in an array. in g:\usr\apache\httpd\html\\class\pager.php on line 45

Wkleje kod tej klasy co zaczełem pisać, może gdzie indziej leży problem ;/

plik pager.php
  1. <?php
  2. class Pager {
  3. // ilosc rekordow z tabeli
  4. public $records_count;
  5. // ilosc rekordow na stronie
  6. public $for_page_records;
  7. // ilosc podstron
  8. public $pages_count = 0;
  9. // nazwa zmiennej
  10. public $var = 'page';
  11. // tablica z danymi do podmiany w szablonie (styl: co => na co)
  12. public $blocks = array();
  13. // zmienna zawierajaca sparsowany wyglad
  14. public $parsed;
  15. // seperator miedzy blokami
  16. public $seperator = '...';
  17. // seperator miedzy liczbami
  18. public $num_seperator = ' ';
  19. // przycisk nastepna podstrona
  20. public $next = '>>';
  21. // przycisk poprzednia podstrona
  22. public $back = '<<';
  23.  
  24. public function __construct($records_count=0, $for_page_records=5)
  25. {
  26. $this->records_count = $records_count;
  27. $this->for_page_records = $for_page_records;
  28. }
  29.  
  30. public function load($template_file)
  31. {
  32. $this->template = file_get_contents($template_file.'.tpl');
  33. }
  34.  
  35. public function how_pages()
  36. {
  37. return $this->pages_count = ceil($this->records_count/$this->for_page_records);
  38. }
  39.  
  40. public function parse()
  41. {
  42. $this->parsed = '';
  43. foreach($this->blocks as $what => $on)
  44. {
  45. $this->parsed = preg_replace('#\{'.$what.'\}#', $on, $this->template);
  46. }
  47. return $this->parsed;
  48. }
  49. }
  50. ?>


plik test.php

  1. <?php
  2. require_once('pager.php');
  3. mysql_connect('localhost', 'root', '');
  4. mysql_query('use sklep');
  5. $query = mysql_query('SELECT * FROM newsy');
  6. $ile = mysql_num_rows($query);
  7.  
  8. $pager = New Pager($ile, 2);
  9. while($array = mysql_fetch_array($query, MYSQL_ASSOC))
  10. {
  11. $pager->load('text'); /// plik do parsowanie bez rozszezenia .tpl
  12. $pager->blocks = array('tytul' => $array['tytul'], 'tresc' => $array['tresc']); /// tablica do podmiany danych w templacie
  13. }
  14. $pager->parse();
  15. echo $pager->parsed;
  16. ?>


no i plik template text.tpl:

  1. <?php
  2. <h2>{tytul}</h2><br /><br />
  3. TRESC: {tresc}.
  4. ?>
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 24.08.2025 - 16:57