Php str_用foreach循环替换bug
我在php中的smiley/emoji函数中遇到了一个问题,它基于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",
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