我正在動態地更新config.php文件,並遇到了一個我無法解決的有趣故障。以下是我更新config.php文件的代碼: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);
}
邏輯相當合理。它會搜索任何以「config-」爲前綴的POST變量,然後將「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
缺乏單引號可以防止配置文件解析(破壞整個網站),並且我們丟失了數據以便引導!在閱讀the PHP preg_replace manual後,我嘗試在幾個位置使用大括號(修改「示例#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個例子,我原來的劇本。
希望有人解決這個問題之前或至少有一個新的想法。
您首次嘗試使用'$ {3}'應該可以工作。 – Qtax 2012-01-09 15:53:43
不幸的是我試過這個,它沒有工作。 – stevendesu 2012-01-09 16:57:06