我有一个带有文本区的表单,用户可以在其中写关于自己的内容。我用PHP处理表单,并在Mysql数据库中存储textarea的值。当我从DB检索值并在文本区再次输出它时,用户可以编辑他们所写的内容,我使用htmlentities函数来编码特殊的html字符。问题是这个函数为它找到的每个'r'n添加了2个额外的新行。例如,如果我在DB中的值是
<>之前你好,我的名字是___。我是______。之前当我使用htmlentities将其输出到文本区域时,显示的是:
<>之前你好,我叫____。我是_______。之前当我打印文本区域内的值时这是我使用的函数:
function profile_input_about( $profile_obj = false ) {
$profile_about = ( $profile_obj ) ? htmlentities( $profile_obj->about, ENT_QUOTES | ENT_HTML5, 'UTF-8' ) : '';
print $profile_about;
}
如果我避免使用htmlentities或使用htmlspecialchars,这不会发生。知道为什么吗?
<标题> 更新我做了一个独立的测试:
<?php
$text = "Hello there,'r'nThis is a test.'r'nWhat do you see?";
?>
<!DOCTYPE html>
<html>
<body>
<textarea><?php print htmlentities( $text, ENT_QUOTES | ENT_HTML5, 'UTF-8' ) ?></textarea>
<textarea><?php print htmlspecialchars( $text, ENT_QUOTES | ENT_HTML5, 'UTF-8' ) ?></textarea>
</body>
</html>
htmlentities()绝对会添加一个额外的'n。
结果如下:
<>之前你好,这是一个测试。你看到了什么?之前和
<>之前你好,这是一个测试。你看到了什么?之前如果我不使用ENT_HTML5标志,问题就会消失。
这应该是这样的还是这是一个php错误?
标题>EDITED -
根据文档,使用htmlentities
,"所有具有HTML字符实体等价物的字符都被翻译成这些实体。"这意味着,'r
被解释为具有相当于'n
的HTML字符实体,因此您有两个新行。
对于htmlspecialchars
,只翻译引号、</>
、&
等字符。'r'n
仍然存在,导致预期的结果是每行文本之间只有一个新的行标记。