Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP使用替换文本文件中的字符串_Php_Html - Fatal编程技术网

PHP使用替换文本文件中的字符串

PHP使用替换文本文件中的字符串,php,html,Php,Html,我有一个存储有用户名和显示名的文件,如下所示: testname=displayname<br> testname2=displayname2<br> etc=etc<br> testname=displayname testname2=displayname2 etc=etc 此列表在同一文件、相同用户名和相同显示名上执行两次。我需要在列表的两个区域中替换它们(需要替换两次) 我正在尝试创建一个表单,用户可以在其中更改其显示名称。我试图从一个页面复制我的

我有一个存储有用户名和显示名的文件,如下所示:

testname=displayname<br>
testname2=displayname2<br>
etc=etc<br>
testname=displayname
testname2=displayname2
etc=etc
此列表在同一文件、相同用户名和相同显示名上执行两次。我需要在列表的两个区域中替换它们(需要替换两次)

我正在尝试创建一个表单,用户可以在其中更改其显示名称。我试图从一个页面复制我的代码,该页面在一个文件中查找了他们帐户的密码,找到了密码,并将其替换,但它似乎不适用于此文件

更改其名称的表单很简单,它让他们输入成员名称(因此我可以使用它在列表中查找他们的名称),然后使用他们输入的显示名称来更改文件中的显示名称

表格页代码:

<center>Change Display Name:<p>
<form action="http://example.com/xxx/displaynamesave.php" class="form" method="post">
<input "membername" name="membername" /><p><input "displayname" name="displayname" /><p><input name="Submit" type="submit" /></form></p>/center>
更改显示名称:

/center>
下面是我处理的php代码

<?
$fileurl = '/xxx/myfiles/sitename/xxx/memberfiletest';

$membername = $_POST['membername'];
$displayname = $_POST['displayname']; 

$file = file($fileurl, FILE_IGNORE_NEW_LINES); // Get file as array of lines

foreach ($file AS $n=>$line)
if (substr($line, 0, 20) === '$membername') // Line starts with 'membername'
    $file[$n] = '$membername = '.$displayname; // Replace displayname

file_put_contents($fileurl, implode("\n", $file)); // Put file back together
$success_page = 'http://example.com/thisplace/xxx/xxx/successredirector.html';
header('Location: '.$success_page);
?>


当我输入数据并点击submit时,它会进入我的成功页面,但是它不会对正确的文件进行任何更改,而且我不确定如何判断我缺少了什么。

您正在
中使用变量。
。试试这个:

foreach ($file as $n => $line) {
    list($name, $dname) = explode('=', trim($line));
    if ($name === $membername) { // Line starts with 'membername'
        $file[$n] = $membername . ' = ' . $displayname; // Replace displayname
    }
}
使用strpos

foreach ($file as $n => $line) {
    if (strpos($line, $membername) === 0) { // Line starts with 'membername'
        $file[$n] = $membername . ' = ' . $displayname; // Replace displayname
    }
}

首先,您的比较以单引号
显示变量,这意味着PHP不会解析它,实际上是将所有内容与$membername进行比较,而不是将变量
$membername
的值进行比较。将比较更改为:

foreach ($file as $n => $line) {
    if (substr($line, 0, 20) === $membername) { // Line starts with 'membername'
        $file[$n] = $membername . ' = ' . $displayname; // Replace displayname
    }
}
其次,在文件内容的示例中,“username”部分的长度不尽相同(“testname”、“etc”),但您的比较是针对行的前20个字符进行的。如果格式确实是
username=displayname
,那么在
=
上拆分行(当然有几种方法可以做到这一点)并比较第一部分可能会有更好的结果。例如:

foreach ($file as $n => $line) {
    $parts = explode('=', $line);
    if ($parts[0] == $membername) {
        $file[$n] = $membername . ' = ' . $displayname;
    }
}

完全忽略了这一点,谢谢你,ksimka,遗憾的是,更改仍然会通过,但不会对文件进行任何更改是的,因为还有其他错误。看到真棒,谢谢戴维斯,我很感激,因为它更容易检查前20个字符的行时,使用预先确定的单词,如“密码”,你知道它有8个字符,能够分裂它的基础上,他们的成员名和用户名与=使它更容易注意,如果你有两个类似的名字,比如
john
johns
,你会得到不想要的效果(
johns
可以被
john
覆盖)。请参阅以避免此问题。然后,您可以只使用:strpos($line,$membername。“=”)==0来避免此问题。