我正在尝试创建一个脚本来从同一服务器上的文件中提取变量。
问题是,我一直不知道文件中还有什么内容(脚本是供其他人使用的),所以我真的不想加载所有内容或执行任何编码。
我曾想过使用 file_get_contents 而不是 require 或 include 之类的东西,但我被困住了……有没有办法解析字符串中的所有变量?或者,是否有一种“安全”的方式来包含文件?
非常感谢,詹姆斯
我正在尝试创建一个脚本来从同一服务器上的文件中提取变量。
问题是,我一直不知道文件中还有什么内容(脚本是供其他人使用的),所以我真的不想加载所有内容或执行任何编码。
我曾想过使用 file_get_contents 而不是 require 或 include 之类的东西,但我被困住了……有没有办法解析字符串中的所有变量?或者,是否有一种“安全”的方式来包含文件?
非常感谢,詹姆斯
file_get_contents + preg_match
你需要一些狡猾的正则表达式来配合它。
为什么不将所有变量放在第三个文件中,然后将它们包含在另外两个文件中?
您尝试做的事情听起来很危险,特别是如果“供其他人使用”您的意思是其他人可以编写这些文件。
您应该尝试php tokenizer。
在这种情况下,您根本不希望您的用户编辑 PHP 文件。正如您所指出的,include()
如果您不能信任它的内容,那么您就不能使用该文件。由于您无法将文件作为 PHP 执行,因此即使是PHP 文件也没有任何优势,因此您可以选择自己的脚本更容易读取的格式。例如,使用该功能,您可以轻松地从文件中 parse_ini_file
读取配置值。.ini
如果它必须是 PHP 文件,您可能必须尝试手动解析它。如果您可以要求该文件是 PHP 的一个子集(例如,它只包含变量声明),这听起来是可行的,尽管仍然非常骇人听闻。如果该文件可以合法地成为一个功能齐全的 PHP 脚本,其中恰好定义了一些变量,那么可能是时候重新考虑整个架构了。
function extract_file_variables($path)
{
$tokens = token_get_all(file_get_contents($path));
$variables = [];
$temp_var = null;
foreach ($tokens as $token)
{
if (!is_array($token)) continue;
$value = trim($token[1], "'\"");
if ($token[0] === T_VARIABLE)
{
$temp_var = substr($value, 1);
}
if (!isset($variables[$temp_var]) && $temp_var !== null && in_array($token[0], [
T_CONSTANT_ENCAPSED_STRING, T_LNUMBER, T_DNUMBER,
], true))
{
$variables[$temp_var] = $value;
$temp_var = null;
}
}
return $variables;
}
dbconnection.php:
<?php
$servername = 'localhost';
$username = 'root';
$password = '';
$database = 'my_database';
$conn = mysqli_connect($servername, $username, $password, $database) or die(mysqli_connect_error());
用法:
print_r(extract_file_variables('dbconnection.php'));
结果:
Array
(
[servername] => localhost
[username] => root
[password] =>
[database] => my_database
)