Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it L'avatar di dottwatson
    Registrato dal
    Feb 2007
    Messaggi
    3,012

    [REG EXP]recuperare codice classe php

    buonasera a tutti

    qualcuno saprebbe indicarmi un pattern per poter recuperare il nome della classe e il relativo codice da un file php?

    mi spiego meglio:

    il codice:
    codice:
    <?php
    final class importError{
        private static $parent=null;
        private static $errStr='';
        private static $errNum=0;
        
        final public static function get_error($var){
            echo "restituisco l' errore $var
    ";
            }
        
        final public static function set_error($a="",$b=""){
            echo "imposto l'errore $a con valore = $b
    ";
            }
    
        final public static function fire_error($code){
            
            }
        }
    ?>
    devo recuperare

    codice:
    importError
    e

    codice:
        private static $parent=null;
        private static $errStr='';
        private static $errNum=0;
        
        final public static function get_error($var){
            echo "restituisco l' errore $var
    ";
            }
        
        final public static function set_error($a="",$b=""){
            echo "imposto l'errore $a con valore = $b
    ";
            }
    
        final public static function fire_error($code){
            
            }

    questo è solo un esempio, la classe potrebbe avere qualsiasi proprietà (final static ecc..)


    ho un paio di patterns ma si fermano tutti alla prima occorrenza della graffa chiusa...

    grazie a tutti coloro che mi aiuteranno !!

    Non sempre essere l'ultimo è un male... almeno non devi guardarti le spalle

    il mio profilo su PHPClasses e il mio blog laboweb

  2. #2
    Utente di HTML.it L'avatar di bubi1
    Registrato dal
    Dec 2009
    Messaggi
    1,230
    C'e' una sola classe nel file?

    preg_match('/class ([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*){/',$filestring,$matches);
    $nome_classe=$matches[1];

    per il corpo invece non ti serve il regex. Basta trovare le posizioni del primo e ultimo {}.. una roba tipo questa:

    $corpo = substr(
    $filestring,
    strpos($filestring,'{')+1,
    strrpos($filestring,'}')-1-strpos($filestring,'{')
    );

  3. #3
    Utente di HTML.it L'avatar di dottwatson
    Registrato dal
    Feb 2007
    Messaggi
    3,012
    si c'è uan sola classe nel file,

    provandpo e riprovando ho trovato anche questo pattern che sembra rispondere bene...

    preg_match('/.(class[\s](.*)[\s]*\{(.*?)\}).$/Usmi',$content,$check);

    ma no sò se sia sufficente per non andare in errore....
    Non sempre essere l'ultimo è un male... almeno non devi guardarti le spalle

    il mio profilo su PHPClasses e il mio blog laboweb

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    so che non è esattamente quel che chiedi, ma mi piaceva l'idea...

    Codice PHP:
    $c file_get_contents('classe.php'); // questo è il file che contiene lo script da "decodificare"
    $c substr($c5); $c substr($c0, -2); $c '$_lcls=get_declared_classes();$_lclt=sizeof($_lcls);'.$c.';$_lcls=get_declared_classes();$_lcls=array_slice($_lcls, $_lclt-1);return($_lcls);'$c = eval($c);
    var_export($c); // questo serve a vedere cosa otteniamo... 
    ...dal nome ai metodi (più che al corpo) ci si può poi arrivare...

  5. #5
    Utente di HTML.it L'avatar di dottwatson
    Registrato dal
    Feb 2007
    Messaggi
    3,012
    poi ma l a studio con calma, ma prima devo risolver questo problema

    ecco un altro pattern, funziona bene con classe semplice, adesso devo solo ottimizzarlo pe rle classi che estendono (class ciccio extends pippo....) che mi ritorna tutto fino a pippo nel nome...

    /.class[\s](.*)[\s?]?\{(.*?)\}.$/Usmi
    Non sempre essere l'ultimo è un male... almeno non devi guardarti le spalle

    il mio profilo su PHPClasses e il mio blog laboweb

  6. #6
    Utente di HTML.it L'avatar di bubi1
    Registrato dal
    Dec 2009
    Messaggi
    1,230
    io ho appena fatto un tentativo, e ho partorito questo reg:
    Codice PHP:
    $class_name_def '[a-z_\\x7f-\\xff][a-z0-9_\\x7f-\\xff]*';// e' la definizione corretta di un nome di classe
    $reg '/class[\\s]{1,}('.$class_name_def.')[\\s]*?(?:[\\s]{1,}extends[\\s]{1,}('.$class_name_def.')[\\s]*?)?{(.*?)}/Usmi'
    dovrebbe restiture:
    matches[1] - nome
    matches[2] - corpo

    o se ci sono extend:
    matches[1] - nome child
    matches[2] - nome parent
    matches[3] - corpo

  7. #7
    Utente di HTML.it L'avatar di dottwatson
    Registrato dal
    Feb 2007
    Messaggi
    3,012
    si, sembra rispondere proprio bene,

    ti ringrazio bubi1! e anche eiyen per uno spunto di studio.

    adesso posso procedere alla generazione di una multi estensione di una singola classe valutando i codici ottenuti, senza passare all' estesione classica di php limitata ad un singolo componente
    Non sempre essere l'ultimo è un male... almeno non devi guardarti le spalle

    il mio profilo su PHPClasses e il mio blog laboweb

  8. #8
    Originariamente inviato da dottwatson
    si, sembra rispondere proprio bene,

    ti ringrazio bubi1! e anche eiyen per uno spunto di studio.

    adesso posso procedere alla generazione di una multi estensione di una singola classe valutando i codici ottenuti, senza passare all' estesione classica di php limitata ad un singolo componente
    e come pensi di fare per curiosità?
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  9. #9
    Utente di HTML.it L'avatar di dottwatson
    Registrato dal
    Feb 2007
    Messaggi
    3,012
    per qualcuno sembrerà una bestemmi, io ne vedo invece una buona utilità

    la classe aggregante:
    Codice PHP:
    <?php 
    class aggregation{
        public function 
    __construct(){
            
    $classes    =func_get_args();
            
    $code="";
            foreach(
    $classes as $class){
                
    $file=file_get_contents($class.'.php');
                
    $parsed=$this->parse_class($file);
                
    $code.=($parsed['code']!= false)?"\n{$parsed['code']}\n":"";
                }
            
    $this->code=$code;
            return 
    $this;
            }    
        
        public function 
    compiled(){
            
    $className="lambda___".rand(123456789,987654321);
            
    $outClass=eval("class {$className} {\n {$this->code} \n}");

            return new 
    $className;
            }
        


        final private function 
    parse_class($content){
            
    $out=array('name'=>false,'code'=>false);

            
    $class_name_def '[a-z_\x7f-\xff][a-z0-9_\x7f-\xff]*';// e' la definizione corretta di un nome di classe
            
    $reg '/class[\s]{1,}('.$class_name_def.')[\s]*?(?:[\s]{1,}extends[\s]{1,}('.$class_name_def.')[\s]*?)?{(.*?)}/Usmi';
            
    preg_match($reg,$content,$check);

            if(!empty(
    $check) && isset($check[1]) && isset($check[3])){
                
    $out['name']=$check[1];
                
    $out['code']=$check[3];
                }
            
    //var_dump($out);
            
    return $out;
            }
        
        }

    ?>
    le classettine di test separate nei rispettivi files
    Codice PHP:
    <?php 
    class a{
        private 
    $a=10;
        
        public function 
    get_a(){
            return 
    $this->a;
            }
        public function 
    set_a($val){
            
    $this->a=$val;
            return 
    $this;
            }
        }
    ?>

    <?php 
    class b{
        private 
    $b=20;
        
        public function 
    get_b(){
            return 
    $this->b;
            }
        public function 
    set_b($val){
            
    $this->b=$val;
            return 
    $this;
            }
        }
    ?>

    <?php 
    class c{
        private 
    $c=30;
        
        public function 
    get_c(){
            return 
    $this->c;
            }
        public function 
    set_c($val){
            
    $this->c=$val;
            return 
    $this;
            }
        }
    ?>

    e il test di tutto
    Codice PHP:
    <?php 
    include('aggregator.php');
    $agg= new aggregation('a','b','c');

    $test=$agg->compiled();

    echo 
    $test->get_b();
    ?>
    Non sempre essere l'ultimo è un male... almeno non devi guardarti le spalle

    il mio profilo su PHPClasses e il mio blog laboweb

  10. #10

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.