Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Parsowanie kodu w zmiennej
Forum PHP.pl > Forum > PHP
loganek
Witam, mam następujący problem;
mam:
Kod
$zmienna='hej, liczymy: <? for($i=0; $i<5; $i++)echo $i;?>';

i nie wiem jakiej funkcji użyć, żeby w zmiennej $zmienna2 zostało:
Kod
$zmienna='hej, liczymy: <? for($i=0; $i<5; $i++)echo $i;?>';
$zmienna2=jakasfunkcja($zmienna);//$zmienna2 ma przyjąć wartość hej, liczymy: 01234

chodzi po prostu o przeparsowanie kodu php w zmiennej. Myślałem o wyrażeniach regularnych i funkcji eval, ale ona nie zwraca wartości, tylko wykonuje tekst. Ma ktoś może inny pomysł?
dsk
mozna by wyciac kod pomiedzy <? i ?> i przekazac bezposredno do interpretera php, funkcja exec, i tam wywolanie php cli z kodem, typu
Kod
php -r 'for($i=0; $i<5; $i++)echo $i;'


ale to nie ma najmniejszego sensu,
jesli chodzi tylko o te wyliczenia

  1. <?php
  2. $zmienna='hej, liczymy: ';
  3. for($i=0; $i<5; $i++) $zmienna .= $i;
  4.  
  5. echo $zmienna;
  6. ?>
Zyx
Najprostszy z możliwych patentów - API strumieni.

  1. <?php
  2. class Moj_Strumien
  3. {
  4.    private $read = 0;
  5.    static public $text;
  6.  
  7.    public function stream_open($path, $mode, $options, $opened_path)
  8.    {        
  9.        return true;
  10.    } // end stream_open();
  11.  
  12.    public function stream_close()
  13.    {        
  14.    
  15.    } // end stream_close();
  16.    
  17.    public function stream_read($count)
  18.    {        
  19.        $return = substr(self::$text, $this->read, $count);
  20.        $this->read += $count;
  21.        return $return;
  22.    } // end stream_read();
  23.    
  24.    public function stream_write($data)
  25.    {        
  26.    
  27.    } // end stream_write();
  28.    
  29.    public function stream_eof()
  30.    {        
  31.        return (strlen(self::$text) < $this->read);
  32.    } // end stream_eof();
  33.    
  34.    public function stream_tell()
  35.    {        
  36.    
  37.    } // end stream_tell();
  38.    
  39.    public function stream_seek($offset, $whence)
  40.    {        
  41.    
  42.    } // end stream_seek();
  43.    
  44.    public function stream_stat()
  45.    {        
  46.        return array('foo' => 'bar');
  47.    } // end stream_stat();
  48.    
  49.    public function url_stat($path, $flags)
  50.    {        
  51.        return array('foo' => 'bar');
  52.    } // end url_stat();
  53. } // end Moj_Strumien;
  54.  
  55. stream_register_wrapper('zmienna', 'Moj_Strumien');
  56.  
  57. Moj_Strumien::$text = 'hej, liczymy: <? for($i=0; $i<5; $i++)echo $i;?>'; // Wprowadzamy tekst do pamięci strumienia
  58.  
  59.  
  60. // wykonujemy tekst
  61. require('zmienna://foo'); // zamiast "foo" mozna wpisac cokolwiek, bo nie napisalismy tak zaawansowanej obslugi.
  62. $zmienna = ob_end_flush();
  63.  
  64. // cieszymy się.
  65.  
  66. ?>


Klasę można oczywiście rozbudować, by była możliwość zapisania do niej wielu różnych wartości - w tym celu należy napisać jakąś obsługę do stream_open().
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.