我怎样才能将 '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);
所以我已经有了一个如何做到这一点的概念 - 但实际上实施我对我自己来说有点困难;主要是因为我缺乏正则表达式经验 - 但让我们开始吧。
我想 '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);