#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