【问题标题】:Regular Expression to replace line if exist, add line if not正则表达式如果存在则替换行,如果不存在则添加行
【发布时间】:2009-03-17 12:29:14
【问题描述】:

我需要通读一个 Apache httpd.conf 文件,并找到以下行:

#LoadModule blah blah

并取消注释,即替换为

LoadModule blah blah

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

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

知道如何用 PHP 编写这个吗?

【问题讨论】:

    标签: php regex


    【解决方案1】:

    试试这个:

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

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

    【讨论】:

      【解决方案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";
      

      【讨论】:

        【解决方案3】:
        <?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);
        ?>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-09-30
          • 1970-01-01
          • 2020-03-21
          • 1970-01-01
          • 1970-01-01
          • 2023-01-31
          • 1970-01-01
          相关资源
          最近更新 更多