Обратные ссылки PHP, за которыми следуют переменные, начинающиеся с цифр - PullRequest
0 голосов
/ 09 января 2012

Я работал над динамическим способом обновления файла config.php, и у меня возник интересный сбой, который я не могу полностью решить.Ниже приведен мой код для обновления файла config.php:

if( isset( $_POST['submitted'] ) ) {

    $config_keys = array();
    foreach( $_POST as $key => $value ) {
        if( substr( $key, 0, 7 ) == 'config-' ) {
            $config_keys[ substr( $key, 7 ) ] = $value;
        }
    }

    $config_content = file_get_contents( dirname(__FILE__) . '/../../inc/config.php' );

    foreach( $config_keys as $key => $value ) {

        $config_content = preg_replace(
                                "/config\['$key'\](\s*)=(\s*)(['\"]?).*?(['\"]?);/",
                                "config['$key']$1=$2$3$value$4;",
                                $config_content
                            );

        $config[$key] = $value;

    }

    file_put_contents( dirname(__FILE__) . '/../../inc/config.php', $config_content );

}

Логика довольно здравая.Он ищет любые переменные POST с префиксом «config-», а затем использует все после «config-» в качестве имени ключа в нашем файле конфигурации для обновления.Файл конфигурации имеет вид:

$config['var1'] = 'value1';
$config['var2'] = 123;
$config['var3'] = '...';

В 90% случаев это работает отлично, однако, если $value начинается с цифры, тогда $3 и первая цифра $value полностью игнорируются во времязамена.

Например, в моем файле конфигурации есть следующее значение:

$config['ls_key'] = '136609a7b4....'; // Rest of key has been truncated

Если я не изменю это значение и оставлю ключ без изменений, но отправлю свою форму, тогда этострока внезапно выглядит так:

$config['ls_key'] = 36609a7b4...'; // Rest of key has been truncated

Отсутствие одинарных кавычек не позволяет разбору конфигурационного файла (ломать весь сайт), и мы потеряли данные для загрузки!После прочтения руководства по PHP preg_replace я попытался использовать фигурные скобки в нескольких местах (изменив « Пример # 1, используя обратные ссылки, за которыми следуют числовые литералы »).Ничего из следующего не помогло:

"config['$key']$1=$2${3}$value$4;",
"config['$key']$1=$2$3${value}$4;",
"config['$key']$1=$2$3{$value}$4;",
"config['$key']$1=$2{$3}$value$4;", // This one actually leads to syntax errors
"config['$key']${1}=${2}${3}$value${4};",

Первые 3 приводят к точно такой же проблеме, не влияя на замену.Четвертый не работает вообще (синтаксические ошибки), а пятый фактически игнорирует КАЖДУЮ обратную ссылку.Я также пытался использовать одинарные кавычки и конкатенацию следующим образом:

'config[\'$key\']$1=$2$3' . $value . '$4;',

Опять же, у меня была та же проблема, что и в 3 предыдущих примерах, и мой оригинальный скрипт.

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

Ответы [ 2 ]

2 голосов
/ 09 января 2012

Кажется, интерполяция с двойными кавычками все портит.Эта замена работает:

'config[\''.$key.'\']$1=$2${3}'.$value.'$4;'

Также обратите внимание, что вы должны правильно экранировать следующие (метасимволы):

  • $key в регулярном выражении с preg_quote
  • $key и $value в замене, для этого нет встроенной функции (preg_quote слишком много экранирует)

А также экранирует разделитель регулярных выражений и разделитель кавычек, еслинет.

0 голосов
/ 09 января 2012

Попробуйте \g{1} для группы 1 (и соответственно для других групп)

См. Руководство php по ссылкам

Обновление:

Конечно, Qtax прав, это синтаксис обратных ссылок внутри регулярного выражения. (+1 для Qtax)

...