Я работал над динамическим способом обновления файла 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 предыдущих примерах, и мой оригинальный скрипт.
Надеясь, что кто-то решил эту проблемудо или по крайней мере, есть новая идея.