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

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

Например:

$row_rsCatalogsItems[Name] 

(Плохо)

вместо

 $row_rsCatalogsItems['Name'] 

(хорошо)

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

В идеале это не будет просто соответствовать [something], но также и переменной $ variable_name [someIndex].

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

Related of "Метод (например, через скрипт bash), чтобы превратить индексы php-массива в настоящее время с использованием констант в индексы массивов с использованием одинарных кавычек?"

Это звучит как работа для 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 – это должно облегчить работу с этими обманчивыми индексами массива. Вот список всех токенов еще раз, на всякий случай, если вы его пропустили .)

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

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

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

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

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

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

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

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