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来避免此问题。