$array[foo] = "bar";
// this should become
// $array['foo'] = "bar"
Да, это всегда вызывало уведомление и всегда было плохой практикой.
echo "hello, my name is $array[foo] and it's nice to meet you";
// would need to become
// echo "hello, my name is " . $array['foo'] . " and it's nice to meet you";
Нет, этот стиль никогда не вызывал уведомления и не делает этого сейчас. Фактически, используется в качестве примера в документации PHP. PHP никогда не уберет возможность интерполировать переменные массива в строках.
Ваш первый случай достаточно прост, чтобы разобраться с чем-то вроде этого:
$str = '$array[foo] = "bar";';
echo preg_replace("/(\\$[a-z_][a-z0-9_]*)\\[([a-z][a-z0-9_]*)\\]/", "$1['$2']", $str);
Но, конечно, нужно ловить только за пределами строки.
Как и в случае любой сложной грамматики, регулярные выражения никогда не будут такими надежными, как синтаксический анализатор грамматики. Поскольку вы анализируете PHP-код, наиболее точным решением будет использование собственного синтаксического анализатора PHP .
$php = <<< 'PHP'
<?php
$array[foo] = "bar"; // this line should be the only one altered.
$array['bar'] = "baz";
echo "I'm using \"$array[foo]\" and \"$array[bar]\" in a sentence";
echo 'Now I\'m not using "$array[foo]" and "$array[bar]" in a sentence';
PHP;
$tokens = token_get_all($php);
$in_dq_string = false;
$last_token = null;
$output = "";
foreach ($tokens as $token) {
if ($last_token === "[" && is_array($token) && $token[0] === 319 && !$in_dq_string) {
$output .= "'$token[1]'";
} elseif (is_array($token)) {
$output .= $token[1];
} else {
if ($token === "\"") {
$in_dq_string = !$in_dq_string;
}
$output .= $token;
}
$last_token = $token;
}
echo $output;
Выход:
<?php
$array['foo'] = "bar"; // this line should be the only one altered.
$array['bar'] = "baz";
echo "I'm using \"$array[foo]\" and \"$array[bar]\" in a sentence";
echo 'Now I\'m not using "$array[foo]" and "$array[bar]" in a sentence';
Этот код должен учитывать некоторые крайние случаи, например, когда вы намеренно используете константу в качестве индекса массива.