我怎样才能将 'PHP' 文件的片段分解成原始的 PHP - 并且 - 可能是原始的 HTML - 按顺序-

How can I break out segments of a 'PHP' file into raw PHP, -and- possible raw HTML -in order-

所以我已经有了一个如何做到这一点的概念 - 但实际上实施我对我自己来说有点困难;主要是因为我缺乏正则表达式经验 - 但让我们开始吧。

我想 'parse' 通过 'php' 文件,该文件可能包含如下内容:

<?php
function Something()
{
}
?>

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

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

如果准确解释 - 以上是毫无价值的胡言乱语 - 但它是我希望能够解析或解释的内容的一个很好的例子...

我的想法是,我将读取上述文件的内容,并将其分解为各个部分的有序数组;在跟踪每个 'segment' 是什么 'type' 的同时,这样我就可以简单地回显它,或者 运行 一个 '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();"

等等...

最初的想法是简单地 'include()' 或 'require()' 有问题的文件,并从输出缓冲区中获取其输出 - 但我突然意识到我希望能够注入在评估代码之前,将一些 'top level' 变量添加到这些文件中的每一个中。为此,我必须 'eval()' 我注入的代码,以及所述注入后的文件内容 - 但为了做到这一点,也能够处理文件中的原始 HTML,我基本上必须编写整个文件的临时克隆,只是在实际内容之前编写了我的注入代码......麻烦且缓慢。

我希望你们都关注这里...如果没有我可以澄清...

我觉得在完成这个问题之前我应该​​注意的唯一另一件事是;是我想保留在段 0 和 2 中创建的一般变量或符号(例如“Something() 函数)”,例如,并将它们传递给段“4”...我觉得这可能可以使用提取方法实现,然后在我的下一个片段执行之前手动写入这些数据——但我又在黑暗中拍摄了一点。

如果有人有更好的方法,或者可以给我一些从文件中提取这些 'segments' 的简短代码,我会欣喜若狂。

干杯

ETA:我突然意识到我可以更简单地提出这个问题:如果没有 'simple' 方法来完成上述操作,是否有办法处理与 'require()' 和 'include()' 处理文件的方式完全相同

<?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 个你想要的文件段数组,不是你想要的确切格式,但你可以很容易地修改这个数组以满足你的需要。

对于 "I'd like to break all of my '$GLOBALS' variables out into their 'simple' names" 部分你可以使用 extract 比如

extract($GLOBALS);