ďťż
Podstrony
|
telcocafeCześć na swojej stronce używam bardzo prostego systemu tplów który został mi tutaj polecony.Mam jednak wielki problem z poźniejszym wykonania tpla. function execute() { return preg_replace('/{([^}]+)}/e', '$this->dane["\\1"]', $this->tmpl); } Strona która aktualnie robie nie składa się tylko z jednego TPLa tylko z kilku. Generowane jest menu stop i kilka innych rzeczy. Z góry założyłem że strona musi być w wielu językach. Dlatego też umieściłem nazwy linków i działów w bazie danych. Troche bez sensu dla mnie jest przekazywanie kilka razy do różnych tplów tablicy językowej pobranej z bazy. Chciałbym że wszystkie nazwy linków były już dodawane w fazie finalnej, ale nie jestem w stanie przerobić metody execute() bo nierozumiem zastosowanego tutaj wyrażenia regularnego. Mianowicie w pliku *.tpl aby coś zostało zmienione za pomocą tej funkji musi mieć taką postać {jaksitekst} chciałbym żeby metoda execute() pomijała, nie zmieniała tych tagów które nie mają tekstu który są zastępowane, lub żebym mógl zastosować inny typ tagów na przykład {{jakistekst}} i wykonywać to za pomocą metody execute2() dzięki czemu tagi {jaksitekst} nie zostaną usunięte z pliku tylko zamienione na tekst właściwy dopiero kiedy wywołam metodę execute() a nie execute2(). Jak to zrobić ? Przeczytałem wiele poradników i manuali dotyczących wyrażeń regularnych w tym cały manual na php.net. Wiem o tym niestety tylko odrobine więcej niż wiedziałem. :pomocy: <?php class Template { var $tmpl; var $dane; function Template ($name) { $this->tmpl = implode('', file($name)); $this->dane = Array(); } function add($name, $value = '') { if (is_array($name)) { $this->dane = array_merge($this->dane, $name); } else if (!empty($value)) { $this->dane[$name] = $value; } } function execute() { //Tag {jakistekst} return preg_replace('/{([^}]+)}/e', '$this->dane["\\1"]', $this->tmpl); } function execute2() { //Inny tag np {{jakistekst}} lub {|jakistekst|} return preg_replace('co tutaj ma byc ?', '$this->dane["\\1"]', $this->tmpl); } } ?> Jeżeli chodzi o wyrażenie regularne to mówi ono o tym, że to "coś" do podmiany musi mieć postać { nazwa } ... Fajnie ale nie chodzi o samo wyrażenie wiem do czego ono jest bo je stosuję. Nie rozumiem oznaczeń w nim i uniemożliwia mi to zmodyfikowanie go tak jak napisałem. No chyba wytłumaczyłem wystarczając dobrze na czym polega mój problem. /{ - slash służy jako stworzenie z { normalnego znaku(nie znaku specjalnego) ([^}]+) - nawiasy służą do ogarnięcia tekstu do podmiany. Znak ^ przed } oznacza, że w podmienianym wyrazie nie może wystąpić właśnie znak }. + oznacza, że słowo/a muszą wystąpić przynajmniej 1 raz, bo [] oznacza ogarnięcie fragmentu, do którego odnosi się + }/e - }, czyli koniec znacznika w którym jest wyraz, /e - tego nie wiem ;) Użytkownik marrek13 edytował ten post 04 październik 2006, 13:04 Dziańkuje =] Modyfikator e: If this modifier is set, preg_replace() does normal substitution of backreferences in the replacement string, evaluates it as PHP code, and uses the result for replacing the search string. Single and double quotes are escaped by backslashes in substituted backreferences. Only preg_replace() uses this modifier; it is ignored by other PCRE functions. Notatka: This modifier was not available in PHP 3. Mimo iż jestem w stanie przetłumaczyć to sobie na język polski to nadal nie mam bladego pojęcia co to oznacza ;( Przepraszam że odświerzam temat w ten beszczelny sposób ale nie chcę zakładać drugiego topica z tym samym problemem. function execute() { return preg_replace('/{([^}]+)}/e', '$this->dane["\\1"]', $this->tmpl); } function execute2() { return preg_replace('/(([^)]+))/e', '$this->dane["\\1"]', $this->tmpl); } No więc w takim razie skoro execute() mi zamienia {jakistekst} to chyba execute2() powinno zamieniać (jakistekst) i dlaczego w drugim parametrze funkcji są te backslashe przy 1 co to oznacza ? return preg_replace('/\(([^)]+)\)/e', '$this->dane["\\1"]', $this->tmpl); ?? Działa :] Jeszcze jakbyś mi powiedział po co są te backslashe. Bo na stronie z tutkiem jest jakoś pokrętnie opisane ( chlip ). Aby nie traktował nawiasów jako instrukcji dla prega, tylko jako zwykly tekst. tutaj jest to ładnie opisane, po co są te backslashe. Aby nie traktował nawiasów jako instrukcji dla prega, tylko jako zwykly tekst. tutaj jest to ładnie opisane, po co są te backslashe. Dzięki a w drugim parametrze funkcji ? '$this->dane["\\1"]' Aha czyli slashe i backslashe służa do tego samego. A jaka jest reguła ich stosowania. TO znaczt kiedy się stosuje jedne a kiedy drugie. Nie nie, chodzi o to, że slashe w tym akurat zapytaniu służyły wskazaniu gdzie się ciąg zaczyna a gdzie kończy. Zamiast nich mógłbyś dać np. ^, ale to chyba sprawa gustu.. return preg_replace('/\(([^)]+)\)/e', '$this->dane["\\1"]', $this->tmpl); Pogrubiona część to pierwsze miejsce zapytania* gdzie szukać ciągu tekstu - jak pierwsze to jest zwracane w zmiennej \\1 (obsługiwanej tylko w obrębie cudzysłowi). Gdyby było np. return preg_replace('/\(([^)]+)!([^)]+)\)/e', '$this->dane["\\1"]', $this->tmpl); To by zamieniło [przykładowo] (Cześć!Jak sie masz) na samo $this->dane['Cześć']. Gdyby zamiast \\1 dać \\2 to by zamieniło na $this->dane['Jak sie masz'];. Mam nadzieję że rozumiesz =] Swoją drogą - zamiast \(([^]+)\) nie wystarczyłoby prostrze \((.*)\) ? Równie dobrze, zamiast \\1, \\2 itd. możesz zastosować zmienną $1, $2 itd. * - używałem słowa "zapytanie" z braku lepszego odpowiednika :P Użytkownik Einzeinbleth edytował ten post 07 październik 2006, 12:23 |
|||
Sitedesign by AltusUmbrae. |