我有一个带有textarea的表单,用户可以在其中撰写自己的文章。我正在使用PHP处理表单并将textarea的值存储在Mysql DB中。当我从DB中检索值以在textarea中再次输出它时,用户可以编辑他们写的内容我正在使用htmlentities函数来编码特殊的html字符。问题是这个函数正在为它们创建的每个\ r \ n添加2个额外的新行。例如,如果我在DB中的值是
Hello, My name is ___. I am a ______ .
当我使用htmlentities将其输出到textarea时,显示的是:
Hello, My name is ____ . I am a _______ .
当我在textarea中打印值时,这是我正在使用的函数:
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。
结果是:
Hello there, This is a test. What do you see?
和
Hello there, This is a test. What do you see?
如果我不使用ENT_HTML5标志,问题就会消失。它显示文本原样。
这应该是这样的还是这个php bug?
答案 0 :(得分:1)
已编辑 -
根据文档,使用htmlentities
,&#34;所有具有HTML字符实体等价物的字符都会被翻译成这些实体。&#34;意思是,\r
被解释为具有等同于\n
的HTML字符实体,因此您有两个新行。
使用htmlspecialchars
,只会翻译引号,</>
,&
等字符。 \r\n
仍然存在,导致每行文本之间只有一个新行标记的预期结果。