从一组特定的PHP源文件中获取包含文件的列表
我需要一个PHP脚本,它将读取其他PHP源文件并提取include、require和require once函数中引用的文件路径。我特别需要它来创建一个部署项目,这样输出包可能只包含项目中使用的库文件夹中的文件从一组特定的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中是否有任何函数可以读取源文件并提取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
)