为什么htmlentities在每行末尾的textarea中添加2个额外的新行?

时间:2014-03-21 15:05:52

标签: php html mysql html-entities

我有一个带有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?

1 个答案:

答案 0 :(得分:1)

已编辑 -

根据文档,使用htmlentities,&#34;所有具有HTML字符实体等价物的字符都会被翻译成这些实体。&#34;意思是,\r被解释为具有等同于\n的HTML字符实体,因此您有两个新行。

使用htmlspecialchars,只会翻译引号,</>&等字符。 \r\n仍然存在,导致每行文本之间只有一个新行标记的预期结果。