2015-02-23 1 views
0

J'ai donc un concept de la façon de faire cela - mais en fait m'implémenter est un peu de un butin pour moi-même; surtout en raison de mon manque d'expérience regex - mais allons-y.Comment puis-je diviser des segments d'un fichier PHP en PHP brut, et-possible en HTML brut -dans l'ordre-

Je voudrais « analyser » à travers un fichier « php » qui pourrait contenir quelque chose comme ce qui suit:

<?php 
function Something() 
{ 
} 
?> 

<html> 
<body> 
<? Something(); ?> 
</body> 
</html> 

<?php 
// Some more code or something 
?> 

Si interprété exactement - ce qui précède ne vaut rien charabia - mais il est un bon exemple de ce que j'aimerais pouvoir analyser, ou interpréter ...

L'idée est que je lirais le contenu du fichier ci-dessus, et le décomposerais en un tableau ordonné de ses pièces respectives; tout en traquant quel 'type' chaque 'segment' est, de sorte que je puisse soit simplement faire écho, soit lancer un 'eval()' dessus.

En effet, je voudrais finir avec un quelque chose de tableau comme ceci:

$FileSegments = array(); 

$FileSegments[0]['type'] = "PHP"; 
$FileSegments[0]['content'] = " 
    function Something() 
    { 
    }"; 

$FileSegments[1]['type'] = "HTML"; 
$FileSegments[1]['content'] = " 
    <html> 
    <body>"; 

$FileSegments[2]['type'] = "PHP"; 
$FileSegments[2]['content'] = "Something();" 

Et ainsi de suite ...

L'idée initiale était simplement « include() » ou ' require() 'le fichier en question, et récupère sa sortie du buffer de sortie - mais j'ai compris que je voudrais pouvoir injecter des variables de' haut niveau 'dans chacun de ces fichiers avant d'évaluer le code. Pour ce faire, je devrais 'eval()' mon code injecté, avec le contenu du fichier après cette injection - mais pour ce faire avec la possibilité de gérer le HTML brut dans le fichier aussi, je devrais essentiellement écrire un clone temporaire de l'ensemble du fichier, qui a juste eu mon code injecté écrit avant le contenu réel ... Cumulant, et lent.

J'espère que vous êtes tous ici ... suite Sinon, je peux préciser ...

La seule autre pièce que je sens que je dois faire remarquer avant de finaliser cette question; est que je voudrais conserver des variables ou des symboles en général (par exemple la fonction 'Something()) créée dans les segments 0 et 2, par exemple, et les transmettre au segment' 4 '... Je pense que cela pourrait être réalisable en utilisant la méthode de l'extrait, puis en écrivant manuellement dans ces morceaux de données avant que mon prochain segment ne s'exécute - mais encore une fois, je tire un peu dans le noir sur ce point.

Si quelqu'un a une meilleure approche, ou peut me donner un bref code sur l'extraction de ces segments d'un fichier, je serais ravi.

acclamations

ETA: il se lève sur moi que je peux probablement poser cette question un peu plus simplement: S'il n'y a pas un « simple » façon de faire ce qui précède, il est un moyen de gérer une chaîne dans le exact de la même manière que 'require()' et 'include()' gèrent un fichier?

+1

Si vous devez analyser un fichier php, puis n'utilisez pas regexp mais utilisez PHP [tokeniser] (http://php.net/manual/en/function.token-get-all.php) ou [parser] (https://github.com/nikic/PHP-Parser) à la place –

+1

Je ne comprends pas pourquoi vous devez analyser le fichier pour injecter des variables au-dessus du contenu de la page. Passez simplement tout votre fichier php principal et incluez le fichier qui devait être appelé à l'origine, ceci peut être fait avec une simple règle de réécriture .htaccess. – cmorrissey

+0

Idéalement (pour une évaluation plus poussée) J'aimerais séparer toutes mes variables '$ GLOBALS' en leurs noms 'simples' à l'intérieur de chaque fichier en cours d'exécution. Par exemple; Au lieu d'avoir à taper '$ GLOBALS [' database ']' trente fois dans un fichier, j'aurais la possibilité d'utiliser une variable '$ Database'. Cela n'a peut-être pas beaucoup de sens pour vous, et ce n'est qu'un exemple; mais c'est toujours quelque chose que j'aimerais accomplir. Si vous ne pouvez pas aider parce que vous ne voyez pas la nécessité c'est bien, mais la question reste. – DigitalJedi805

Répondre

1
<?php  
$str = file_get_contents('filename.php'); 

    // get values from starting characters 
    $php_full = array_filter(explode('<?php', $str)); 
    $php = array_filter(explode('<?', $str)); 
    $html = array_filter(explode('?>', $str)); 


    // remove values after last expected characters 
    foreach ($php_full as $key => $value) { 
     $php_full_result[] = substr($value, 0, strpos($value, '?>')); 
    } 

    foreach ($php as $key => $value) { 
     if(strpos($value,'php') !== 0) 
     { 
      $php_result[] = substr($value, 0, strpos($value, '?>')); 
     } 
    } 

    $html_result[] = substr($str, 0, strpos($str, '<?')); 

    foreach ($html as $key => $value) { 
     $html_result[] = substr($value, 0, strpos($value, '<?')); 
    } 

    $html_result = array_filter($html_result); 

    echo '<pre>'; 
    print_r($php_full_result); 
    echo '</pre>'; 

    echo '<pre>'; 
    print_r($php_result); 
    echo '</pre>'; 

    echo '<pre>'; 
    var_dump($html_result); 
    echo '</pre>'; 

?> 

Cela vous donnera 3 tableaux de segments de fichiers que vous voulez, pas le format exact que vous vouliez mais vous pouvez facilement modifier ces tableaux à vos besoins.

Pour « Je voudrais briser tous mes « $ GLOBALS » les variables hors dans leur nom « simples » » partie que vous pouvez utiliser extract comme

extract($GLOBALS);