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