Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php]Poprawienie systemu szablonów zamiast {ZMIENNA} żeby było {_ZMIENNA_}
Forum PHP.pl > Forum > PHP
kukix
Witam.

Tworze strony internetową na podstawie systsmu szablonów, który znalałżem kiedyś na jakimśportalu.

Problem w tym, że nie mogę dodac żadnego kodu JavaScript, ponieważ wszystko pomiędzy znakami { i } jest wycinane.

Wpadłem na pomysł, żeby poprawić wyrqażnie regularne, żeby zmienne były trzymane nie w samych nawiasach, ale jeszcze z podkreślnikami {_ i _}

Czyli zamiast {ZMIENNA} żeby musiało być {_ZMIENNA_}


Kawałek kodu z wyrażneiem regularnym wygląda tak:

  1. if(preg_match_all('#\{(.*?)\}#is', $this -> compiled, $found)){
  2. foreach($found[1] as $match){
  3. $match_table[] = '\'.'.$this -> generate_block_ref($match).'.\'';
  4. }
  5. $this -> compiled = str_replace($found[0], $match_table, $this -> compiled);
  6. }


Bede wdzięczny za wszelkie wypowiedzi.
tehaha
myślę, że wszystkie popularne systemy szablonów umożliwiają swobodne wstawianie kodu js, co najwyżej musisz objąć jakimś dodatkowym tagiem, poszukaj w dokumentacji

np. w smarty można było zrobić tak:
  1. {literal}
  2. TD {border: none; font-size: 8pt}
  3. {/literal}
  4. </style>
Uriziel01
Ten skrypt ?
http://museum.webcity.pl/webcity/artykuly.php/t/22

Nie ma chyba powodu aby aż tak zmieniać kod, lepiej chyba zrobić parsowanie z pomijaniem bloków <script></script> ?

Ewentualnie jeżeli nie chcesz robić absolutnie żadnych zmian w kodzie możesz je zastąpić przez:
  1. & # 1 2 3 ;
  2. & # 1 2 5 ;

(oczywiście po usunięciu spacji)
ale to raczej szaleństwo wink.gif
kukix
Cytat(Uriziel01 @ 25.01.2012, 16:22:15 ) *
Ten skrypt ?
http://museum.webcity.pl/webcity/artykuly.php/t/22

Nie ma chyba powodu aby aż tak zmieniać kod, lepiej chyba zrobić parsowanie z pomijaniem bloków <script></script> ?

Ewentualnie jeżeli nie chcesz robić absolutnie żadnych zmian w kodzie możesz je zastąpić przez:
Kod
{ {
} }
ale to raczej szaleństwo wink.gif



Tak, to ten skrypt, jestem z niego bardzo zadowolony..

Mam tylko problem ze wstawianiem kodów JavaScript..

Niestety skrypt jest dla mnie zbyt skomplikowany, nie dam rady pominac parsowanie bloków <script></script>
Zastępowac znak { } jego kodem, znaczaco zmniejszy czytelnośc kodu JavaScript.. :/

Wydaje mi się, że jak zmienie bloki z {} do {_ _} to będzie to najlepsze rozwiązanie..
Wystarczy zmienić to wyrażenie regularne:

  1. preg_match_all('#\{(.*?)\}#is', $this -> compiled, $found)
by_ikar
http://forum.php.pl/index.php?showtopic=181343 znajdziesz tam wyrażenie które powinno ci pomóc.
kukix
Cytat(by_ikar @ 25.01.2012, 16:30:06 ) *
http://forum.php.pl/index.php?showtopic=181343 znajdziesz tam wyrażenie które powinno ci pomóc.



Przeglądam ten temat, wyrażenia regularne są mocno skomplikowane :/

Opcja z wyłaczeniem znacnzika <script></SCRIPT> odpada, ponieważ czesto używam np przy zdazeniacjh onClick="" instrukcje warunkowe z tymi nawiasami.
Uriziel01
Rozumiem że nazwy tych zmiennych zawierają same litery ewentualnie cyfry, ogólnie znaki alfanumeryczne. Chyba najlepszym rozwiązaniem będzie dodanie do reguły zastrzeżenia aby parsowała tylko w przypadku gdy pomiędzy klamrami sa jedynie takie znaki, automatycznie znak nowej średnika wyeliminuje taką `zmienną`. Odpowiada ci takie rozwiazanie ?

EDIT:
Tak na szybko:
Kod
'#\{([a-zA-Z0-9]*?)\}#is'


To powinno załatwić sprawę.
kukix
Cytat(Uriziel01 @ 25.01.2012, 16:59:00 ) *
To powinno załatwić sprawę.


Dziekie wielkie za fatygę.. przeczytałem cały temat wskazany przez by_ikar i tam po prostu dodawany jest znacnzik {IGNORE} jest to jednak kłopotliwe rozwiązanie..

Przeglądne całą stronę i poszukam znaczników jakie używałem, prawdopodobnie Twoje rozwiązanie będzie idealne..


Jeżeli doam na końcu \-_. to będzie akceptował również podkreślniki i kropki?? Czy jest to poprawny zapis?


Kod
'#\{([a-zA-Z0-9\-_.]*?)\}#is'

Uriziel01
Wygląda na to że takie coś powinno być dla Ciebie idealne (Alfanumeryczne + podkreślniki + kropki):
  1. ''#\{([a-zA-Z0-9_\.]*?)\}#is'

Mały test:
  1. $html = '{test} and the 3{t.e.s.t.2}d <script>{test3_test333} and {var test4 = "xyz"; }</script>';
  2. preg_match_all('#\{([a-zA-Z0-9_\.]*?)\}#is', $html, $found);
  3. var_dump($found);
by_ikar
Widocznie źle czytałeś, bo tam jest na prawdę proste wyrażenie, tylko tyle że musisz użyć preg_replace_callback żeby całość miała jakiś sens. Kod:

  1. <?php
  2.  
  3. function callbackFunction( $matches )
  4. {
  5. if( !empty( $matches[1] ) )
  6. {
  7. return "<?php $matches[1] ?>";
  8. }
  9. else
  10. {
  11. return preg_replace('/{(\/)?ignore}/is', '', $matches[0]);
  12. }
  13. }
  14.  
  15.  
  16. $txt = "asd {a} afsda {b} asd {ignore} asdsa {c} asdasd {d} asdasd {/ignore} asdasd {e} asdas";
  17. $txt = preg_replace_callback( "#{(?:ignore}.*?{/ignore|(.+?))}#si", "callbackFunction", $txt );
  18.  
  19. echo $txt;
  20.  
  21. ?>


Wynikiem działania takiej funkcji + wyrażenia będzie taki kod:

Kod
asd <?php a ?> afsda <?php b ?> asd asdsa {c} asdasd {d} asdasd asdasd <?php e ?> asdas


Czyli pomija blok ignore, jednocześnie go wywalając z kodu. Sam korzystam z podobnego rozwiązania i póki co sprawdza się świetnie wink.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.