Php str_用foreach循环替换bug

Php str_用foreach循环替换bug,php,jquery,html,chat,Php,Jquery,Html,Chat,我在php中的smiley/emoji函数中遇到了一个问题,它基于str\u replace。这是我的密码 $smileys = array( ":inlove:" => "/smileys/smiley2.png", ":cool:" => "/smileys/smiley3.png", ":tongue:" => "/smileys/smiley4.png",

我在php中的smiley/emoji函数中遇到了一个问题,它基于
str\u 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);
}
$smileys=array(“:inlove:”=>“/smileys/smiley2.png”,
“:酷:”=>“/smileys/smiley3.png”,
“:舌头:”=>“/smileys/smiley4.png”,
“:wow:”=>“/smileys/smiley5.png”,
“:微笑:”=>“/smileys/smiley15.png”,
“:happy:”=>“/smileys/smiley6.png”,
“:搞笑:”=>“/smileys/smiley7.png”,
“:wink:”=>“/smileys/smiley8.png”,
“:担心:”=>“/smileys/smiley10.png”,
“:扑克脸:”=>“/smileys/smiley9.png”,
“:poop:”=>“/smileys/smiley12.png”,
“:thinking:”=>“/smileys/35_thinking.png”,
“:黛安芬:”=>“/smileys/49_黛安芬.png”,
“:vulcan:”=>“/smileys/109_vulcan.png”,
“:pointup:”=>“/smileys/102\u point\u up\u 2.png”,
“:santa:”=>“/smileys/135_santa.png”,
“:spy:”=>“/smileys/134_spy.png”);
如果(isset($_POST['message'])){
$messagePlain=$_POST['message'];
$messageSmileys=$messagePlain;
foreach($smileys as$key=>$img){
$messageSmileys=str_replace($key,,$messageSmileys);
}
$connection->query(//消息到数据库);
}
它很好用。但问题是,当用户在一行中输入超过14个表情符号时,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>

测试07。八月。2017 01:34

有人能帮我吗?为什么
的HTML标记突然被破坏?

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


这一点尤其重要,因为看起来您现在可能很容易受到HTML注入的攻击。确保在进行替换之前运行,并了解如何对输出进行编码以确保安全。这可能是一个好的开始。

查看您的输出:

<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)
更改为
TEXT
LONGTEXT
。看起来它的存储方式有问题。你在使用数据库吗?数据库中消息的存储大小是多少?看起来截断发生在那里。刚刚意识到它存储在数据库(消息)中的行大小为500。我增加了它,现在将测试它#编辑:现在可以了。非常感谢。您可以只执行str_替换(数组键($smileys)、数组值($smileys)、$string)而不是
foreach($smileys
);
您的意思是“相信”而不是“怀疑”吗?@Ryan我相信这就是原因。@Ryan正在用解决方案重写答案。@Ryan检查OP的消息。看起来就是这样。我们都是对的。我增加了它,它起了作用,多亏了@PraveenKumar