解析PHP文件以获取参数数组

Parsing PHP file in order to get an array of parameters

提问人:Viacheslav Ravdin 提问时间:9/21/2023 最后编辑:Viacheslav Ravdin 更新时间:9/22/2023 访问量:76

问:

我有一个PHP文件,内容如下:

<?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");

$APPLICATION->IncludeComponent(
    "hoo:account",
    "hoo",
    array(
        "COMPONENT_TEMPLATE" => "hoo",
        "ACCOUNT_URL" => "/account/",
        "LOG_IN_URL" => "/log-in/",
        "FIELDS_REQUIRED" => array(
            0 => "FIRST_NAME",
            1 => "LAST_NAME",
            2 => "BIRTHDAY",
        ),
        "FIELDS_VALIDATED" => array(
            0 => "BIRTHDAY",
            1 => "COMPANY_VAT_CODE",
        ),
        "AGE_MIN" => "18",
        "AGE_MAX" => "180",
        "COMPANY_VAT_CODE_VALIDATION_SERVICE_CACHE_TTL" => "86400",
        "COMPANY_VAT_CODE_VALIDATION_SERVICE_SERVICE_UNAVAILABLE_ERROR" => "Y",
        ...
    ), false);

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");
?>

不知何故,我需要解析此文件,以便获得带有参数的关联数组,以便在代码中的其他位置使用它。请给我一些想法和代码示例如何实现该目标。

提前致谢!

php 解析 tokenize bitrix

评论

0赞 aynber 9/21/2023
您已经有一个要传递到 IncludeComponent 的关联数组。只需将其提取并存储在其他地方,以便您可以在需要的地方引用它。你把它存放在哪里取决于你。
0赞 Viacheslav Ravdin 9/21/2023
@aynber这看起来是一个显而易见的解决方案,但我想保持这种状态是有原因的。更具体地说,如果我将数组放在单独的变量中,则通过CMS GUI编辑组件属性将停止工作。
0赞 Pippo 9/21/2023
@ViacheslavRavdin请更好地发表您的最后评论
0赞 Barmar 9/21/2023
PHP 解析器库
0赞 Barmar 9/21/2023
没有内置的方法可以执行此操作,除非要提取的代码遵循一致的格式规则。

答:

0赞 Viacheslav Ravdin 9/22/2023 #1

使用 Tokenizer,我能够编写一个小的解析器来实现我的目标:

<?
$tokens = token_get_all();

$componentName = "hoo:account";

$arParams = array();

foreach ($tokens as $tokenKey => $token) {
    if (is_array($token)) {
        if (_getTokenName($token) == "T_STRING" &&
            _getToken($tokens, $tokenKey + 3) == $componentName
        ) {
            $isComponent = true;
        } elseif (_getTokenName($token) == "T_STRING" &&
                  _getToken($tokens, $tokenKey + 3) != $componentName
        ) {
            $isComponent = false;
        }

        if ($isComponent) {
            if (_getTokenName($token) == "T_DOUBLE_ARROW") {
                if (_getTokenName($tokens[$tokenKey - 2]) == "T_CONSTANT_ENCAPSED_STRING") {
                    if (_getTokenName($tokens[$tokenKey + 2]) == "T_ARRAY") {
                        $key = _getToken($tokens, $tokenKey - 2);
                    } else {
                        $arParams[_getToken($tokens, $tokenKey - 2)] = _getToken($tokens, $tokenKey + 2);
                    }
                } elseif (_getTokenName($tokens[$tokenKey - 2]) == "T_LNUMBER") {
                    $arParams[$key][] = _getToken($tokens, $tokenKey + 2);
                }
            }
        }
    }
}

function _getTokenName(array $token): string {
    return token_name($token[0]);
}

function _getToken(array $tokens, int $key): int | string {
    return trim($tokens[$key][1], "\"");
}
?>