fore_re循环的str_replace错误

时间:2017-08-06 23:37:39

标签: php jquery html chat

我的小文本在php中基于str_replace的笑脸/表情符号功能有问题。这是我的代码。

$smileys = array( ":inlove:" => "/smileys/smiley2.png",
                      ":cool:" => "/smileys/smiley3.png",
                      ":tongue:" => "/smileys/smiley4.png",
                      ":wow:" => "/smileys/smiley5.png",
                      ":smile:" => "/smileys/smiley15.png",
                      ":happy:" => "/smileys/smiley6.png",
                      ":funny:" => "/smileys/smiley7.png",
                      ":wink:" => "/smileys/smiley8.png",
                      ":worried:" => "/smileys/smiley10.png",
                      ":pokerface:" => "/smileys/smiley9.png",
                      ":poop:" => "/smileys/smiley12.png",
                      ":thinking:" => "/smileys/35_thinking.png",
                      ":triumph:" => "/smileys/49_triumph.png",
                      ":vulcan:" => "/smileys/109_vulcan.png",
                      ":pointup:" => "/smileys/102_point_up_2.png",
                      ":santa:" => "/smileys/135_santa.png",
                      ":spy:" => "/smileys/134_spy.png");

if(isset($_POST['message'])) {
    $messagePlain = $_POST['message'];
    $messageSmileys = $messagePlain;

    foreach($smileys as $key => $img) {
        $messageSmileys = str_replace($key, '<img src="' . $img . '" />', $messageSmileys);
    }

    $connection->query(// Message to db);
}

工作正常。但问题是,当用户连续输入超过14个emojis时,HTML会被破坏,看起来像这样:

HTML源代码如下:

<div class="media-body">
                            <h4 class="media-heading">test <small>07. August. 2017 01:34</small></h4>
                             <img src="/smileys/smiley2.png" /> <img src="/smileys/smiley3.png" /> <img src="/smileys/smiley5.png" /> <img src="/smileys/smiley4.png" /> <img src="/smileys/smiley15.png" /> <img src="/smileys/smiley6.png" /> <img src="/smileys/smiley7.png" /> <img src="/smileys/smiley8.png" /> <img src="/smileys/smiley10.png" /> <img src="/smileys/smiley9.png" /> <img src="/smileys/smiley12.png" /> <img src="/smileys/49_triumph.png" /> <img src="/smileys/109_vulcan.png" /> <img src="/smileys/102_point_up_2.p                            </div>
</div>

有人可以帮我吗?为什么<img>的HTML标记突然被破坏?

2 个答案:

答案 0 :(得分:1)

看看你的输出:

<img src="/smileys/smiley2.png" /> <img src="/smileys/smiley3.png" /> <img src="/smileys/smiley5.png" /> <img src="/smileys/smiley4.png" /> <img src="/smileys/smiley15.png" /> <img src="/smileys/smiley6.png" /> <img src="/smileys/smiley7.png" /> <img src="/smileys/smiley8.png" /> <img src="/smileys/smiley10.png" /> <img src="/smileys/smiley9.png" /> <img src="/smileys/smiley12.png" /> <img src="/smileys/49_triumph.png" /> <img src="/smileys/109_vulcan.png" /> <img src="/smileys/102_point_up_2.p

以上字符串的长度为499个字符。我坚信数据库表中的message字段限制为500个字符或其他内容,输出被截断为这些位。

解决方案/建议

如果您使用的是MySQL数据库服务器,我强烈建议您将数据库类型从VARCHAR(500)更改为TEXTLONGTEXT

答案 1 :(得分:0)

您的数据库字段可能有长度限制。您可能想提出这个问题,但是有一个更重要的初始修复:将原始文本存储在数据库中,然后在输出上执行替换。

这一点尤为重要,因为您现在可能很容易受到HTML注入攻击。确保在更换前运行htmlspecialchars,并了解如何对输出进行编码以确保安全。 How to prevent XSS with HTML/PHP?可能是一个好的开始。