2015-02-23 52 views
0

所以我有一個如何做到這一點的概念 - 但實際上實現我有點爲我自己的一個stumper;主要是由於我缺乏正則表達式的經驗 - 但讓我們進入它。如何將'PHP'文件的段分解爲原始PHP, - 和 - 可能的原始HTML - 在訂單中 -

我想「解析」通過「PHP」文件可能包含類似以下內容:

<?php 
function Something() 
{ 
} 
?> 

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

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

如果恰好解釋 - 上面是毫無價值jibberish - 但它是一個很好的例子我希望能夠解析或解釋...

這個想法是,我會讀取上述文件的內容,並將其分解成各個部分的有序數組;同時跟蹤每個'段'的'類型',以便我可以簡單地回顯它,或者在其上運行'eval()'。

實際上,我想用一個數組這樣的事情結束了:

$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();" 

等等......

最初的想法是簡單的「包括()」或' require()'有問題的文件,並從輸出緩衝區獲取它的輸出 - 但在我看來,我希望能夠在評估代碼之前爲這些文件中的每一個注入一些「頂級」變量。要做到這一點,我必須''注入(')我注入的代碼,與注入後的文件的內容 - 但爲了做到這一點的能力,在文件中處理原始HTML也,我必須基本上寫一個整個文件的臨時克隆,它只是在實際內容之前寫入了我的注入代碼......繁瑣且速度慢。

我希望你們都按照這裏......如果沒有我可以澄清...

唯一的其他部分我覺得我完成這項問題之前,應注意;是我想保留通常的變量或符號(例如,在部分0和2中創建的'Something()函數),並將它們傳遞給部分'4'...我覺得這可能會可以使用提取方法實現,然後在我的下一個片段執行之前手動寫入這些數據片段 - 但是我再次在黑暗中拍攝一些內容。

如果任何人有更好的方法,或者可以給我一些簡單的代碼,只是從文件中提取這些'段',我會欣喜若狂。

歡呼

ETA:它照在我,我也許可以多一點簡單地提出這個問題:如果沒有「簡單」的方式做以上,有沒有一種方法來處理'require()'和'include()'處理文件的相同方式的確切中的字符串?

+1

如果你要解析一個PHP文件,然後不要使用正則表達式,而是使用PHP [tokeniser](http://php.net/manual/en/function.token-get-all。PHP)或[解析器](https://github.com/nikic/PHP-Parser)而不是 – 2015-02-23 21:54:30

+1

我不明白爲什麼你需要解析文件注入頁面內容的變量。只要通過你的主要php文件傳遞所有內容,幷包含最初打算被調用的文件,這可以通過簡單的.htaccess重寫規則來完成。 – cmorrissey 2015-02-23 21:59:58

+0

理想情況下(進一步評估)我想將所有'$ GLOBALS'變量分解爲每個正在執行的文件中的'簡單'名稱。例如;而不是必須在文件中鍵入'$ GLOBALS ['database']'三十次,我纔有能力使用'$ Database'變量。這可能對你沒有多大意義,這只是一個例子;但它仍然是我想達到的目標。如果你不能幫助,因爲你沒有看到這樣的必要性,但問題仍然存在。 – DigitalJedi805 2015-02-23 22:03:43

回答

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>'; 

?> 

這會給你3個你想要的文件段的數組,但不是你想要的確切格式,但你可以很容易地修改這個數組以滿足你的需要。

對於「我想打破所有我的‘$ GLOBALS’變量伸到自己的‘簡單’名稱」部分,你可以使用extract

extract($GLOBALS);