Способ (например, с помощью bash-скрипта) превратить индексы массива php, использующие константы в данный момент, в индексы массива, использующие строки в одинарных кавычках?

#php #bash #scripting #code-cleanup

#php #bash #скриптинг #очистка кода

Вопрос:

У меня есть огромная куча php-скриптов с множеством констант, используемых вместо правильных строк массива в одинарных кавычках.

Например:

 $row_rsCatalogsItems[Name]
  

(плохо)

вместо

 $row_rsCatalogsItems['Name']
  

(хорошо)

Как бы мне создать скрипт (bash, php, любой наиболее удобный), который я мог бы запускать на скриптах, чтобы преобразовать их в более разумный метод?

В идеале это должно соответствовать не только [something], но и $variable_name[someIndex].

На самом деле мне интересно, является ли это вообще жизнеспособным, учитывая возможность испортить внутреннюю часть строк или html… (возможно, если я просто использую одинарные кавычки, это не будет иметь значения, потому что они все равно интерполируются …)

Комментарии:

1. Помните, что допустимый синтаксис заключен в двойные кавычки ".. $var[key] .." . Одинарные кавычки вокруг ключа там не разрешены, если вы не используете синтаксис выражения переменной в фигурных скобках "{$var['key']} .

Ответ №1:

Похоже, это задача для токенизатора!

Вы можете извлечь все проанализированные токены из исходного файла PHP с помощью token_get_all . Затем вы можете просмотреть результирующий массив, оценивая каждый токен по одному за раз. Имя токена возвращается в виде числа, которое вы можете найти с помощью token_name .

Небольшая демонстрация в интерактивной строке PHP:

 php > $str = '<?php echo $face[fire]; echo $face['fire']; ?>';
php > $t = token_get_all($str);
php > foreach($t as $i => $j) { if(is_array($j)) $t[$i][0] = token_name($j[0]); }
  

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

 php > print_r($t);
Array
(
    [0] => Array
        (
            [0] => T_OPEN_TAG
            [1] => <?php
            [2] => 1
        )

    [1] => Array
        (
            [0] => T_ECHO
            [1] => echo
            [2] => 1
        )

    [2] => Array
        (
            [0] => T_WHITESPACE
            [1] =>
            [2] => 1
        )

    [3] => Array
        (
            [0] => T_VARIABLE
            [1] => $face
            [2] => 1
        )

    [4] => [
    [5] => Array
        (
            [0] => T_STRING
            [1] => fire
            [2] => 1
        )

    [6] => ]
    [7] => ;
    [8] => Array
        (
            [0] => T_WHITESPACE
            [1] =>
            [2] => 1
        )

    [9] => Array
        (
            [0] => T_ECHO
            [1] => echo
            [2] => 1
        )

    [10] => Array
        (
            [0] => T_WHITESPACE
            [1] =>
            [2] => 1
        )

    [11] => Array
        (
            [0] => T_VARIABLE
            [1] => $face
            [2] => 1
        )

    [12] => [
    [13] => Array
        (
            [0] => T_CONSTANT_ENCAPSED_STRING
            [1] => 'fire'
            [2] => 1
        )

    [14] => ]
    [15] => ;
    [16] => Array
        (
            [0] => T_WHITESPACE
            [1] =>
            [2] => 1
        )

    [17] => Array
        (
            [0] => T_CLOSE_TAG
            [1] => ?>
            [2] => 1
        )

)
  

Как вы можете видеть, наши злые индексы массива — это a, за T_VARIABLE которым следует открытая скобка, затем a, T_STRING которое не заключено в кавычки. Индексы, заключенные в одинарные кавычки, отображаются в виде T_CONSTANT_ENCAPSED_STRING , кавычек и всего остального.

Имея эти знания в руках, вы можете просмотреть список токенов и фактически переписать исходный код, чтобы исключить все индексы массива без кавычек — большинство из них должны быть довольно очевидными. Вы можете просто заключить строку в одинарные кавычки при обратной записи файла.

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

Также имейте в виду, что выражения разрешены внутри индексов:

 $pathological[ some_function('Oh gods', 'why me!?') . '4500' ] = 'Teh bad.';
  

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

(Также обратите внимание, что токенизатор обрабатывает синтаксис фигурной строки как фактический токен, T_CURLY_OPEN — это должно упростить работу с этими надоедливыми встроенными индексами массива. Вот список всех токенов еще раз, на случай, если вы это пропустили.)

Ответ №2:

Вот подход, который я в конечном итоге выбрал, просто для справки:

Все элементы commmon (верхний, нижний колонтитулы, боковые панели) удаляют все свои уведомления и получают повышенные настройки отчетности (например, они регистрируют уведомления).

Основной контент, который устарел и содержит множество уведомлений, уже игнорируется, а уведомления не отображаются / регистрируются.

Новый основной контент, который я пишу, будет иметь повышенные настройки отчетов.

Ответ №3:

Я также унаследовал устаревший PHP-код и создал короткий PHP-скрипт, который брал исходный файл и заменял индексы массива без кавычек. По сути, это делает то, что Чарльз предлагает в другом ответе.

В комментарии включен скрипт bash commanline, который вызовет средство исправления индекса массива для всех исходных файлов PHP в папке и вложенных папках.

Вы можете получить копию скрипта здесь:

https://github.com/GustavBertram/php-array-index-fixer/blob/master/aif.php