从一组特定的PHP源文件中获取包含文件的列表

从一组特定的PHP源文件中获取包含文件的列表,php,Php,我需要一个PHP脚本,它将读取其他PHP源文件并提取include、require和require once函数中引用的文件路径。我特别需要它来创建一个部署项目,这样输出包可能只包含项目中使用的库文件夹中的文件 PHP中是否有任何函数可以读取源文件并提取require、include和require_once语句中的路径?尝试以下操作: <?php $source = file_get_contents('source.php'); preg_match_all('/(include|i

我需要一个PHP脚本,它将读取其他PHP源文件并提取include、require和require once函数中引用的文件路径。我特别需要它来创建一个部署项目,这样输出包可能只包含项目中使用的库文件夹中的文件


PHP中是否有任何函数可以读取源文件并提取require、include和require_once语句中的路径?

尝试以下操作:

<?php 
$source = file_get_contents('source.php');
preg_match_all('/(include|include_once|require|require_once) *\(? *[\'"](.*?)[\'"] *\)? *;/', $source, $matches);
$files = $matches[2];

这是正确的答案,它实际上解析PHP语法。请注意,要真正做你想做的事是不可能的。例如,您可能有无法自动提取的自动加载程序或变量包含路径

<?php
$required_file    = '';
$required_files   = array();
$is_required_file = false;

// Parse the PHP source using the Tokenizer library (PHP 4.3.0+)
$tokens           = token_get_all($text);

foreach ($tokens as $token) {
    // Get the token name to make our code more readable.
    $token_name = is_int($token[0]) ? token_name($token[0]) : $token[0];

    echo $token[0]. ': ' . htmlentities($token[1]) . '<br>';

    // Is this token a require/include keyword?
    if (in_array($token_name, array('T_INCLUDE', 'T_INCLUDE_ONCE', 'T_REQUIRE', 'T_REQUIRE_ONCE'))) {
        $is_required_file = true;
    }

    elseif ($is_required_file && $token[0] != ';' && $token[0] != '.' && $token_name != 'T_WHITESPACE') {
        if ($token_name == 'T_STRING') {
            $token[1] = '{{CONST:' . $token[1] . '}}';
        }
        $required_file .= $token[1] ? trim($token[1], '\'"') : $token[0];
    }

    elseif ($is_required_file && $token[0] == ';') {
        $is_required_file = false;
        $required_files[] = trim($required_file, ' ()');
        $required_file    = '';
    }
}
你会得到这样的结果:

Array
(
    [0] => {{CONST:APPLICATION_MODULES_ROOT}}test1.php
    [1] => test55.php
    [2] => test2.php
    [3] => test3.php
    [4] => test4.php
    [5] => test5.php
    [6] => test6.php
    [7] => test7.php
    [8] => test8.php
    [9] => test9.php
    [10] => test10.php
    [11] => test11.php
    [12] => test12.php
)
您所要做的就是使用str_replace或类似方法替换应用程序使用的常量


重要提示:这不适用于变量include name,例如
include$some\u path。您无法解析这些代码。

请包含您尝试过的代码以及出现的错误。询问代码的问题必须证明对正在解决的问题的最低理解。包括尝试过的解决方案、它们不起作用的原因以及预期结果。没出什么差错。只需要一个算法来解析源文件,并以某种方式将pathsLook提取到使用中。@brandon wamboldt get_included_文件不能用于这种情况,因为我们不包括这些文件。只是尝试读取和解析文件内容。@asim ishaq我几乎有了一个工作版本我在项目中尝试了这个解决方案。它为require(“myfile.php”)等语法提取文件名。我的项目有这样的代码用于require(APPLICATION_MODULES_ROOT.\\pages\\Screen.php);但它不适合我的代码。让我也试试你的其他解决办法。@asim ishaq我明白了。我的另一个示例也无法满足您的需要。我也尝试了这一点,但出现了错误:警告:token\u name()希望参数1很长,第378行F:\dev\htdocs\package.php中给出的字符串。第378行引用:$token\u name=token\u name($token[0])@asim ishaq正在更新我的代码,我已经进一步调试了这个算法。$token[0]通常包含一个数字,但并非始终包含。一些无效值如下:,;)}{[我是否可以添加签入代码,以便它检查$token[0]中的数字,然后进一步处理?
Array
(
    [0] => {{CONST:APPLICATION_MODULES_ROOT}}test1.php
    [1] => test55.php
    [2] => test2.php
    [3] => test3.php
    [4] => test4.php
    [5] => test5.php
    [6] => test6.php
    [7] => test7.php
    [8] => test8.php
    [9] => test9.php
    [10] => test10.php
    [11] => test11.php
    [12] => test12.php
)