我正在使用以下代码将文本框的内容发布到HTML文件。提交信息后,我希望在换行符处插入<br/>
。我认为使用此代码可以解决问题:
$content = nl2br($_POST['content']);
但是如果已经有<br />
,它似乎产生了以下内容:
Lorum ipsum。
<br /><br />
我该如何解决这个问题?
邮政编码:
<?php
$fn = "people.html";
if (isset($_POST['content']))
{
$content = stripslashes('content');
$content = nl2br($_POST['content']);
$fp = fopen($fn,"w") or die ("Error opening file in write mode!");
fputs($fp,$content);
fclose($fp) or die ("Error closing file!");
}
?>
如何提交:
<form action="<?php echo $_SERVER["PHP_SELF"] ?>" method="post">
<textarea rows="25" cols="40" name="content"><?php readfile($fn); ?></textarea>
<input type="submit" value="Sauver">
</form>
答案 0 :(得分:2)
根据我的理解,如果您的插入的html已包含<br />
标记,那么由于\n
之后的<br />
,它会添加两个,为了解决此问题,您需要删除使用str_replace或regex输入的额外中断标记。
然后,当将结果回显给textarea时,你应该使用:<?=htmlentities(file_get_contents($fn))?>
作为SpoonNZ的建议。
注意:使用用户提交的html而不通过表单中的htmlentities
或$_SERVER["PHP_SELF"]
将向您开放XSS
答案 1 :(得分:2)
您不应将您的换行符<br>
存储在持久存储(您的文本文件)中。在文本文件中,换行符应存储为换行符("\n"
)。将它们输出到HTML时,只应将它们转换为HTML <br>
标记。您还需要转义您放入HTML的任何用户提供的内容(为什么,请阅读The Great Escapism)。
if (!empty($_POST['content'])) {
file_put_contents('people.txt', $_POST['content']);
}
然后:
<textarea rows="25" cols="40" name="content"><?php
echo nl2br(htmlspecialchars(file_get_contents('people.txt')));
?></textarea>
这种方式换行符总是换行符,它们只需要转换为<br>
,因为这是在HTML上下文中保存它们的唯一方法。
至于为什么换行加倍,似乎在某些时候添加了一个额外的换行符,可能是在提交textarea内容时由浏览器添加。您可能希望trim
输入/输出以避免任何前导或尾随空格。
答案 2 :(得分:1)
//$content = stripslashes('content');
$content = preg_replace('~\s*<br ?/?>\s*~',"<br />",$_POST['content']);
$content = nl2br($content);
这样的东西应该为你划掉多余的空白。
另外,你为什么要使用stripslashes?只有在你有魔术引号时才应该这样做,而你不应该有魔法引号。无论如何,你还有这条线的语法错误。
编辑:仍然试图解释你在说什么。我认为这可能会有所帮助:
<form action="<?php echo $_SERVER["PHP_SELF"] ?>" method="post">
<textarea rows="25" cols="40" name="content"><?htmlentities(preg_replace('~\s*<br ?/?>\s*~i',"\n",(file_get_content($fn))); ?></textarea>
<input type="submit" value="Sauver">
</form>'
将从正确的数据开始。也许