3

我正在尝试创建一个脚本来从同一服务器上的文件中提取变量。

问题是,我一直不知道文件中还有什么内容(脚本是供其他人使用的),所以我真的不想加载所有内容或执行任何编码。

我曾想过使用 file_get_contents 而不是 require 或 include 之类的东西,但我被困住了……有没有办法解析字符串中的所有变量?或者,是否有一种“安全”的方式来包含文件?

非常感谢,詹姆斯

4

5 回答 5

3

file_get_contents + preg_match

你需要一些狡猾的正则表达式来配​​合它。

于 2009-08-19T02:22:40.060 回答
2

为什么不将所有变量放在第三个文件中,然后将它们包含在另外两个文件中?

您尝试做的事情听起来很危险,特别是如果“供其他人使用”您的意思是其他人可以编写这些文件。

于 2009-08-19T02:09:44.973 回答
2

您应该尝试php tokenizer

于 2012-05-19T02:05:49.237 回答
1

在这种情况下,您根本不希望您的用户编辑 PHP 文件。正如您所指出的,include()如果您不能信任它的内容,那么您就不能使用该文件。由于您无法将文件作为 PHP 执行,因此即使PHP 文件也没有任何优势,因此您可以选择自己的脚本更容易读取的格式。例如,使用该功能,您可以轻松地从文件中 parse_ini_file读取配置值。.ini

如果它必须是 PHP 文件,您可能必须尝试手动解析它。如果您可以要求该文件是 PHP 的一个子集(例如,它只包含变量声明),这听起来是可行的,尽管仍然非常骇人听闻。如果该文件可以合法地成为一个功能齐全的 PHP 脚本,其中恰好定义了一些变量,那么可能是时候重新考虑整个架构了。

于 2009-08-19T02:10:51.853 回答
1
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
)
于 2022-01-08T11:10:57.320 回答