Php preg_replace仅在第一次执行

Php preg_replace仅在第一次执行,php,file-io,preg-replace,Php,File Io,Preg Replace,我正在尝试使用html表单编辑配置文件。编辑(settings.php)文件如下所示: $config['foo'] = FALSE; $config['maintenance'] = FALSE; //this line is that what it matters $config['bar'] = FALSE; 这里的想法是更改$config['maintenance'],因此一旦提交表单(有一个名为maintenance的复选框,以便根据其状态将状态设置为true或false),我将

我正在尝试使用html表单编辑配置文件。编辑(settings.php)文件如下所示:

$config['foo'] = FALSE;
$config['maintenance'] = FALSE;  //this line is that what it matters
$config['bar'] = FALSE;
这里的想法是更改
$config['maintenance']
,因此一旦提交表单(有一个名为
maintenance
的复选框,以便根据其状态将状态设置为true或false),我将复选框值设置为:

$status = ($_POST['maintenance'] === 'on')? "TRUE" : "FALSE";
我已经调试了
$status
var值,这里一切正常。现在,我使用下面的正则表达式查找文件中的正确行:

\$config\[(\s+)?(\'|")maintenance(\'|")(\s+)?\](\s+)?=(\s+)?(false|FALSE|true|TRUE);/
最初“有效”很好,因为我不确定,但让我完成解释。。。 根据上面的代码,现在我继续进行替换:

//read the content and replace it
$content = preg_replace(
    '/\$config\[(\s+)?(\'|")maintenance(\'|")(\s+)?\](\s+)?=(\s+)?(false|FALSE|true|TRUE);/',
    '$config["maintenance"] = ' . $status . ';', 
    file_get_contents($file)
);

//set the new content
file_put_contents($file, $content); 
当我第一次选中复选框运行它时,它会工作,结果如下:

$config['foo'] = FALSE;
$config["maintenance"] = TRUE;
$config['bar'] = FALSE;
但是,无论我在复选框中选择什么,该文件都不会显示任何更改。你能指引我找到错误的正确方向吗?多谢各位

编辑。 这是html标记

<label>
    <input type="checkbox" name="maintenance" /> in maintenance mode
</label>

处于维护模式
试试这个:

$status = (isset($_POST['maintenance'])) ? 'TRUE' : 'FALSE';
以及:


但是,您发布的代码对我来说效果很好,您应该进行更多的调试,如:

error_reporting(-1);
或者在替换前后检查$content。检查错误日志(如果已将display_errors设置为on,则搜索错误消息)。可能有什么问题。(例如,文件权限)

还应考虑:

  • 完全重写配置文件,而不是仅仅替换一行-它可能容易出错
  • 在向文件写入/读取文件时获取锁

请发布表单的HTML代码。很抱歉耽搁了,我正在旅行。。。嗯,我认为这里的html是I相关的,因为错误存在于php文件中,因为我可以根据选择得到正确的值。此外,您提供给我的正则表达式也可以工作,但结果相同:)@manix HTML与您使用
($\u POST['maintenance']=='on')?
时相关,您可以在表单字段中为该复选框检查'value'。如果您不选中复选框,则字段不会提交到表单,因此您需要使用
isset()
,正如我上面所示。非常感谢您的时间和帮助。问题是文件包含操作post数据。对我是个白痴。代码和您的一切都很好:)我感谢您的帮助!上面的一切都很好。因此,我认为一旦我编辑了文件,字符更改和正则表达式可以再次匹配
error_reporting(-1);