Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: parser szablonów
Forum PHP.pl > Forum > Przedszkole
audifan
Postanowiłem pobawić się systemem szablonów, który został opisany tu. Jest to część enginu strony.
W szablonach instrukcje są zapisywane tak: <!-- IF -->

Działa bardzo dobrze, poza jedną rzeczą. Powienie obsługiwać instrukcji IF oraz ELSEIF.

Niestety dla instrukcji IF zwraca dobry rezultat tylko dla zmiennej PHP_VERSION o wartość 4.3.10. Dla wszystkich innych zwraca zły wynik.

Wydaje mi się, że problem jest w tej fukcji:


  1. <?php
  2. function parse_if($pattern, $what){ 
  3.          /* Tokenize args for 'if' tag. */ 
  4.          preg_match_all('/(?: 
  5.                "[^"]*(?:.[^"]*)*" | 
  6.                '[^']*(?:.[^']*)*' | 
  7.                [(),] | 
  8.                [^s(),]+)/x', $pattern, $match); 
  9.  
  10.          $tokens = $match[0]; 
  11.          $is_arg_stack = array(); 
  12.  
  13.          for ($i = 0; $i < count($tokens); $i++){ 
  14.             $token = &$tokens[$i]; 
  15.  
  16.             switch ($token){ 
  17.                case 'eq': 
  18.                   $token = '=='; 
  19.                   break; 
  20.  
  21.                case 'ne': 
  22.                case 'neq': 
  23.                   $token = '!='; 
  24.                   break; 
  25.  
  26.                case 'lt': 
  27.                   $token = '<'; 
  28.                   break; 
  29.  
  30.                case 'le': 
  31.                case 'lte': 
  32.                   $token = '<='; 
  33.                   break; 
  34.  
  35.                case 'gt': 
  36.                   $token = '>'; 
  37.                   break; 
  38.  
  39.                case 'ge': 
  40.                case 'gte': 
  41.                   $token = '>='; 
  42.                   break; 
  43.  
  44.                case 'and': 
  45.                   $token = '&&'; 
  46.                   break; 
  47.  
  48.                case 'or': 
  49.                   $token = '||'; 
  50.                   break; 
  51.  
  52.                case 'not': 
  53.                   $token = '!'; 
  54.                   break; 
  55.  
  56.                case 'mod': 
  57.                   $token = '%'; 
  58.                   break; 
  59.  
  60.                case 'div': 
  61.                   $token = '/'; 
  62.                   break; 
  63.  
  64.                case 'add': 
  65.                   $token = '+'; 
  66.                   break; 
  67.  
  68.                case 'sub': 
  69.                   $token = '-'; 
  70.                   break; 
  71.  
  72.                case 'mul': 
  73.                   $token = '*'; 
  74.                   break; 
  75.  
  76.                case '(': 
  77.                   array_push($is_arg_stack, $i); 
  78.                   break; 
  79.  
  80.                default: 
  81.                   if(preg_match('#{(((([a-zA-Z0-9-_]+?.)*?)([a-zA-Z0-9_]+?))|(@[a-zA-Z0-9_]+?)|(([a-zA-Z0-9_]+?)@([a-zA-Z0-9_]+?)))}#s', $token, $varrefs)){ 
  82.                      $token = $this->generate_block_ref($token); 
  83.                   }elseif($token{0} == '@'){ 
  84.                      $token = '$this -> _variables[''.$token.'']'; 
  85.                   } 
  86.                   break; 
  87.                } 
  88.             } 
  89.             return (($what) ? '} elseif (' : ' '; if (') . (implode(' ', $tokens) . ') { $this -> compiled .= '' . "n"); 
  90.          } 
  91.       } // end parse_if();
  92. ?>


Może ktoś znajdzie błąd w tej fukcji

--edit:
Używaj odpowiednich tagów BBCode...
~crash
bela
Zobacz czy na forum (webcity) nie ma rozwiazania. Zadaj pytanie tam.
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.