PHP修改文本文件中的单行

时间:2012-09-19 05:26:26

标签: php string file text

我试过并寻找解决方案,但找不到任何明确的解决方案。

基本上,我有一个列出用户名和密码的txt文件。我希望能够更改某个用户的密码。

users.txt文件的内容:

user1,pass1
user2,pass2
user3,pass3

我尝试过以下php代码:

            // $username = look for this user (no help required)
            // $userpwd  = new password to be set 

    $myFile = "./users.txt";
    $fh = fopen($myFile,'r+');

    while(!feof($fh)) {
        $users = explode(',',fgets($fh));
        if ($users[0] == $username) {
            $users[1]=$userpwd;
            fwrite($fh,"$users[0],$users[1]");
        }
    }       

    fclose($fh);    

5 个答案:

答案 0 :(得分:8)

这应该有效! :)

$file = "./users.txt";
$fh = fopen($file,'r+');

// string to put username and passwords
$users = '';

while(!feof($fh)) {

    $user = explode(',',fgets($fh));

    // take-off old "\r\n"
    $username = trim($user[0]);
    $password = trim($user[1]);

    // check for empty indexes
    if (!empty($username) AND !empty($password)) {
        if ($username == 'mahdi') {
            $password = 'okay';
        }

        $users .= $username . ',' . $password;
        $users .= "\r\n";
     }
}

// using file_put_contents() instead of fwrite()
file_put_contents('./users.txt', $users);

fclose($fh); 

答案 1 :(得分:2)

我认为当你获得该文件后使用file_get_contents使用preg_replace作为特定用户名

我过去曾经做过这样的事情,比如这里

               $str = "";

       $reorder_file = FILE_PATH;
       $filecheck = isFileExists($reorder_file);

       if($filecheck != "")
        {
            $reorder_file = $filecheck;
        }
        else
        {
            errorLog("$reorder_file :".FILE_NOT_FOUND);
            $error = true;
            $reorder_file = "";
        }
        if($reorder_file!= "")
        {
            $wishlistbuttonhtml="YOUR PASSWORD WHICH YOU WANT TO REPLACE"
            $somecontent = $wishlistbuttonhtml;
            $Handle = fopen($reorder_file, 'c+');
            $bodytag = file_get_contents($reorder_file);
            $str=$bodytag;
            $pattern = '/(YOUR_REGEX_WILL_GO_HERE_FOR_REPLACING_PWD)/i';
            $replacement = $somecontent;
            $content = preg_replace($pattern, $replacement, $str,-1, $count);
            fwrite($Handle, $content); 
            fclose($Handle);
        }   

希望这会有所帮助......

答案 2 :(得分:1)

这样做的正确方法是使用数据库。数据库可以轻松地进行随机访问,使用较少的文本文件。

如果由于某种原因无法切换到数据库,并且您不希望系统拥有超过一千个用户,则只需读取整个文件就可以轻松实现,转换它到PHP数据结构,进行需要进行的更改,将其转换回文本并覆盖原始文件。

在这种情况下,这意味着file()将文本文件加载到一个数组中,每个元素都是用户名和密码作为字符串,在逗号上爆炸数组上的所有元素以分别获取用户名和密码,进行您需要进行的更改,然后将修改后的数据写入光盘。

您可能还会发现fgetcsv()对于读取数据非常有用。如果您使用SplFileObject并拥有最新版本的PHP,那么fputcsv()也可用于将数据写回。

然而,仅使用数据库是一个更好的解决方案。适合工作的正确工具。

答案 3 :(得分:0)

如果您使用的是* nix系统,则可以使用sed;我发现它比使用文件句柄等更整洁:

exec("sed -i '/^$username,.\+\$/$username,$userpwd/g' ./users.txt 2>&1", $output, $return);

如果不是我同意GordonM并将文件解析为PHP数据结构,操纵它,然后将其放回去:

$data = file_get_contents('./users.txt');

$users = array_map(function($line) {
  return explode(',', $line);
}, explode("\n", $data));

foreach ( $users as $i => $user ) {
  if ( $user[0] == $username ) {
    $user[1] = $userpwd;
    $users[$i] = $user;
  }
}

file_put_contents('./users.txt', implode("\n", array_map(function($line) {
  return implode(',', $line);
}, $users)));

当然,有很多方法可以做到这一点!

答案 4 :(得分:0)

$fn = fopen("test.txt","r") or die("fail to open file");

$fp = fopen('output.txt', 'w') or die('fail to open output file');
while($row = fgets($fn)) 
{
    $num    = explode("++", $row);

    $name   = $num[1];
    $sex    = $num[2];
    $blood  =  $num[3];
    $city   = $num[4];

    fwrite($fp, "Name:  $name\n");
    fwrite($fp, "Sex:   $sex\n");
    fwrite($fp, "Blood: $blood\n");
    fwrite($fp, "City:  $city\n");
}
fclose($fn);
fclose($fp);