preg_replace()不起作用

时间:2015-06-05 10:15:54

标签: php regex pcre

我目前正在尝试更改配置文件中的变量。我尝试了以下内容:

colnames(df$x2)
NULL

在以下字符串上:

public static function change(){
    $fl = file("../config.inc.php");
    $key = $_POST['key'];
    $id = $_POST['id'];
    $secret = $_POST['secret'];
    $content = "";
    foreach($fl as $line){
        $content .= $line;
    }
    $content = preg_replace("\$licence = array\(\'key\'=>\'(.*?)\'\);$", "licence = array('key'=>'$key');", $content);

    $content = preg_replace("/\$rey_connect = array\((.*?\'client_id\'=>\')(.*?)('.*?\'client_secret\'=>\')(.*?)(\')(.*?)(?:\));(?:\n|$)/", "\$rey_connect = array(\1$id\3$secret\5);", $content);

    $myfile = fopen("../config.inc.php", "w") or die("Unable to open file!");
    $txt = "$content";
    fwrite($myfile, $txt);
    fclose($myfile);
}

因此正则表达式完全正常on phpliveregex,但不在我的脚本中。不知何故,它不会影响配置文件的内容。

2 个答案:

答案 0 :(得分:3)

  1. 您是否将更改恢复为配置?
  2. // this is really BAD approach
    $content = file_get_contents("config");
    $content = preg_replace(...);
    file_put_contents("config", $content);
    // or eval($content);
    
    1. 如果你想用稍微不同的参数重新连接到数据库,你可以简单地将你的代码移动到单独的函数并用不同的参数调用它,例如:你有一个名为utils.php的脚本
    2. function connect($host, $db, $pwd, $user, $key, $id, $secret)
      {
          $mysql = array('host'=>$host,
                         'database'=>$db,
                         'password'=>$pwd,
                         'user'=>$user);
          $licence = array('key'=>$key);
          $rey_connect = array('active'=>true,'client_id'=>$id,'client_secret'=>$secret);
      }
      

      然后将utils.php包含到另一个脚本中并在那里调用你的函数。

      include_once 'utils.php';
      
      connect(
       'localhost', 
       'schnnet', 
       'root, 
       'root', 
       'jZf5hhRd5vqmwTkMB9eq', 
       '123', 
       '123456');
      

      更新:

      我能够重现您所描述的问题,但刚刚在我的本地服务器上运行了简化版本的代码,现在它似乎正在按预期工作。试试吧。

      <?php
          function change()
          {
              $id = 'someId';
              $key = 'someKey';
              $secret = 'someSecret';
              $content = file_get_contents("config.php");
      
              $content = preg_replace("/(licence[^>]+)([^)]+)(.+)/si", "$1>'" . $key . "'$3", $content);
              $content = preg_replace("/(client_id[^>]+)([^,]+)(.+)/si", "$1>'" . $id . "'$3", $content);
              $content = preg_replace("/(client_secret[^>]+)([^)]+)(.+)/si", "$1>'" . $secret . "'$3", $content);
      
              file_put_contents("config.php", $content);
          }
      
          change();
      ?>
      

答案 1 :(得分:1)

您的代码运行良好:http://ideone.com/Gev03z

(虽然在更换字符串之前你不需要'\'。)

问题在于您没有将$content写回文件。

更改$content只会更改文件内容的本地副本。

修改

这显然不是正则表达式问题,而是文件权限问题。

当您致电fwrite时,您不会检查回报是否为false。在这种情况下,我希望它是,这意味着你不能写入文件。

现在除非我错过了我的猜测,这是因为$fl因为文件已经打开了。请尝试在close($fl);之前添加$myfile