Метод (например, с помощью скрипта bash) для преобразования индексов массива php, использующих в настоящее время константы, в индексы массива с использованием строк в одинарных кавычках? - PullRequest
1 голос
/ 13 апреля 2011

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

Например:

$row_rsCatalogsItems[Name]

(плохо)

вместо

$row_rsCatalogsItems['Name']

(хорошо)

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

В идеале он не просто соответствует [что-то], но и $ variable_name [someIndex].

Мне действительно интересно, является ли он вообще жизнеспособным, учитывая потенциалиспортить внутренности строк или HTML ... (может быть, если я просто использую одинарные кавычки, это не имеет значения, потому что они все равно интерполируются ...)

Ответы [ 3 ]

2 голосов
/ 13 апреля 2011

Это звучит как работа для Tokenizer !

Вы можете получить все проанализированные токены из исходного файла 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
        )

)

Как видите, наши индексы злых массивов - это T_VARIABLE, за которым следует открывающая скобка, затем T_STRING, то есть , а не в кавычках. Индексы в одинарных кавычках представлены как T_CONSTANT_ENCAPSED_STRING, кавычки и все.

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

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

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

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

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

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

0 голосов
/ 22 ноября 2012

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

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

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

0 голосов
/ 14 июля 2011

Вот подход, который я выбрал, просто для справки:

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

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

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

...