如果存在则替换行的正则表达式,否则添加行

时间:2009-03-17 12:29:15

标签: php regex

我需要阅读Apache httpd.conf文件,找到以下行:

#LoadModule blah blah

并取消注释,即用

替换它
LoadModule blah blah

这里的问题是,由于conf文件可能会有所不同,因此LoadModule行很可能已经取消注释。

也有可能该行根本就不存在,在这种情况下,我的脚本必须在conf文件的末尾添加这样一行。

知道怎么用PHP写这个吗?

3 个答案:

答案 0 :(得分:2)

试试这个:

preg_replace('/^#(LoadModule blah blah)/m', '$1', $str)

如果blah blah应该是变量,请将其替换为“.+”。

答案 1 :(得分:2)

$line  = "LoadModule blah blah";
$input = "your config file";
$count = 0;
$limit = 1;  // replace first occurrence only, change to -1 to replace all

$output = preg_replace("/^#?(?=\Q$line\E)/m", "", $input, $limit, $count);

if ($count == 0) $output = $output."\n$line";

答案 2 :(得分:1)

<?php
$found = false;
$f = fopen('apache.conf', 'r+');

while($line = fgets($f)) {
    if(preg_match("/^(#*)(\s*)LoadModule\s+blah.*/", $line)) {
        $found = true;
        if(substr($line, 0, 1) == '#') {
            fputs($f, preg_replace("/^(#+)(\s*)/", "", $line));
        }
        break;
    }
}

if(!$found) {
    fputs($f, "LoadModule blah blah\n");
}

fclose($f);
?>