Разбор PHP-файла для получения массива параметров

У меня есть файл 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");
?>

Каким-то образом мне нужно проанализировать этот файл, чтобы получить ассоциативный массив с параметрами, чтобы использовать его где-то еще в моем коде. Пожалуйста, дайте мне несколько идей и примеров кода, как достичь этой цели.

Заранее спасибо!

У вас уже есть ассоциативный массив, который вы передаете в IncludeComponent. Просто извлеките его и сохраните где-нибудь еще, чтобы вы могли ссылаться на него там, где вам это нужно. Где хранить, решать вам.

aynber 21.09.2023 15:50

@aynber это выглядит очевидным решением, но я хочу оставить его таким по какой-то причине. Точнее, если я помещу массив в отдельную переменную, редактирование свойств компонента через графический интерфейс CMS перестанет работать.

Viacheslav Ravdin 21.09.2023 15:52

@ViacheslavRavdin, пожалуйста, объясните лучше свой последний комментарий

Pippo 21.09.2023 16:28
Библиотека парсера PHP
Barmar 21.09.2023 16:30

Для этого нет встроенного способа, если только код, который вы хотите извлечь, не соответствует последовательным правилам форматирования.

Barmar 21.09.2023 16:30

@Barman на самом деле так и есть, функция $APPLICATION->IncludeComponent имеет третий параметр, который я хочу извлечь...

Viacheslav Ravdin 21.09.2023 16:52

Файл начинается с <? а не с <?php. Если это оплошность, исправьте свой код.

lukas.j 21.09.2023 16:53

@lukas.j php.net/manual/en/ini.core.php#ini.short-open-tag

Viacheslav Ravdin 21.09.2023 17:16

@ViacheslavRavdin Разве они не устарели с PHP 7.4 и не предназначены для полного удаления?

lukas.j 21.09.2023 17:32

@lukas.j Честно говоря, я не знаю, но производитель моей CMS требует, чтобы для этой директивы было установлено значение 0.

Viacheslav Ravdin 21.09.2023 19:45
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
10
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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], "\"");
}
?>

Другие вопросы по теме