提问人:Viacheslav Ravdin 提问时间:9/21/2023 最后编辑:Viacheslav Ravdin 更新时间:9/22/2023 访问量:76
解析PHP文件以获取参数数组
Parsing PHP file in order to get an array of parameters
问:
我有一个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");
?>
不知何故,我需要解析此文件,以便获得带有参数的关联数组,以便在代码中的其他位置使用它。请给我一些想法和代码示例如何实现该目标。
提前致谢!
答:
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], "\"");
}
?>
评论