文本区域添加额外的标签

时间:2015-06-25 06:39:47

标签: php

我有一个简单的CMS,允许管理员通过表单中的textarea字段更新文本。不幸的是,一旦将br标签引入文本字段,每次用户单击提交按钮时,会在每个现有标签旁边添加一个额外的br标签。我认为这是因为我的nl2br函数每次提交表单时都会创建一个重复的br标记。我试图修剪帖子数据,str_replace br与n linebreak,并设置包裹软和硬,都无济于事。包含或排除htmlentities没有任何效果。这是我尝试做的事情的本质:

<?php
function echo_homepage($name) {
global $connection;
$query = "SELECT info FROM homepage WHERE name = '{$name}'";
$result = mysqli_query($connection, $query);    
confirm_query($result);
$data_array = mysqli_fetch_assoc($result);
$info = $data_array["info"];
$info = htmlentities($info);
echo nl2br($info);
}

if(isset($_POST["field1"]) || isset($_POST["field2"])) {
    $field1 = mysqli_real_escape_string($connection, $field1);
    $field2 = mysqli_real_escape_string($connection, $field2);
    $query1 = "UPDATE homepage SET info='{$field1}' WHERE name='field1' LIMIT 1";
    $query2 = "UPDATE homepage SET info='{$field2}' WHERE name='field2' LIMIT 1";
    $result1 = mysqli_query($connection, $query1);
    $result2 = mysqli_query($connection, $query2);
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <title>Form</title>
</head>
<body>
<form action="edit_homepage.php" method="post">
    <fieldset id="" title="Left Column of Text">
        <ol>
            <li>
                <textarea name="field1" id="info1" cols="50" rows="8" ><?php echo_homepage("field1"); ?></textarea>
            </li>   
        </ol>   
    </fieldset>
    <fieldset id="" title="Right Column of Text">
        <ol>
            <li>
                <textarea name="field2" id="info1" cols="50" rows="8"  ><?php echo_homepage("field2"); ?></textarea>
            </li>
        </ol> 
        <button type="submit">Update Text</button>
    </fieldset>
</form>

表单使用mysql字段中已有的文本填充textarea。一切正常,直到有一个br标签(我想要)。一旦存在br标签,每次用户点击提交按钮时,在旧标签旁边放置一个额外的br标签。我需要用户能够点击输入并创建一个行空间,但是当我们点击表单的提交按钮时,我无法添加额外的br标记。

非常感谢阅读。

编辑 - 答案

好的,感谢@ eX0du5参考以下评论。注释中的大多数辅助函数都不起作用,但我终于找到了一个解决方案,通过在注释中包含此函数来重写输出文本的函数(在这种情况下唯一的函数): / p>

function nl2br2($string) {
$string = str_replace(array("\r\n", "\r", "\n"), "<br />", $string);
return $string;
}

我用这个替换了echo_homepage的最后一行:

echo br2nl($info); 

我在大约七个帖子中发现了类似的问题,但都没有明确的答案,所以我希望有所帮助。欢呼声。

1 个答案:

答案 0 :(得分:1)

为什么不在转义字符串并将其插入数据库之前删除<br>?根据{{​​3}}(参见评论),您不会使用\n丢失换行符nl2br()。因此,再次摆脱<br>就足够了。

我不确定您是否要允许HTML代码。如果没有,则应删除所有带有documentation的HTML标记。

这会使对您的网页进行XSS攻击变得更加困难。