2013-10-14 97 views
0

你好,我意识到这是一个很大的问题,我看了很多不同的帖子和答案,试图找出我自己的答案,然后再打扰到张贴在这里,但我真的努力让以下工作。在输入的文本中停止html

我在制作聊天室的过程中,如果您在文本框中键入文本,然后单击输入密钥ID 30,然后发送消息(这是正常的功能)。但是,如果您要在文本框中键入html,则在发送邮件时将发生html。这在我的项目进展中造成了很大的问题。有很多帖子在那里说使用...

htmlspecialchars(); 

我发现这些消息甚至达到了我的PHP文件中的文本框中输入的HTML已经发生的被点击回车键之前。我现在试图找到一些我可以在javascript部分中做的事情,我可以在文本输入时停止文本,并对文本框进行调整,因此如果我输入以下密钥...

< //which has the key ID of 60 

然后,它会在文本框中将其替换为/ <,或者甚至在键盘按下功能发生时不断检查并替换文本框中的html字符,然后将其替换。这意味着当我将文本从文本框中移出时,它就会被解码,并且不会在邮件中留下任何html标签,这会阻止它们在我的聊天室中生效。

的东西,如下面的代码...

$("#messagearea").keydown(function{ 
    var replacementtext = this.replace() // html characters I'm not that familiar with  this function but I believe it is what I need to use. 
    messagearea = replacementtext 
} 

喜欢的东西上面会然后让我检查输入的字符,每次有一个按键按下事件和与被乱停的HTML我现场。如果有人可以给我一些关于如何写这个的帮助或者是否有更好的方法来做这件事?这将非常感谢。

+0

您需要通过映射HTML实体来替换它们。请参考:http://www.w3schools.com/html/html_entities.asp –

+1

'this.replace(/ <(?:.|\n)*?>/gm,'');' –

回答

2

你的问题太常见了,来自jQuery的人已经为你解决了它。

var encodedText = $("#message-box").text(); 

看一看the jQuery documentation文本功能的深入讨论。


好的,让我扩展我的答案,因为戴夫的评论。关于如何实现我认为戴夫的意思的最基本的例子。

你的HTML:

<!doctype html> 
<html> 
<head> 
    <title>Chat</title> 
    <style>.invalid{border:red}</style> 
</head> 
<body> 
    <div id="chat"> 
    <p><span class="user">Foo:</span> Bar</p> 
    </div> 
    <form id="message-form" action="/chat.php" method="post"> 
    <textarea id="message" name="message" placeholder="Enter chat message ..." autofocus></textarea> 
    <input type="submit" value="Send"> 
    </form> 

你的jQuery:

$(function() { 
    var $chat = $('#chat'); 
    var $messageForm = $('#message-form'); 
    $messageForm.$message = $('#message'); 
    $('#message-form').submit(function (e) { 
    e.preventDefault(); 
    this.originalMessage = this.$message.val(); 
    this.$message.val('').prop('disabled', true); 
    $.post('/chat.php', { json: true, message: this.originalMessage }, function (response) { 
     if (response.error) { 
     $messageForm.$message 
      .val($messageForm.originalMessage) 
      .addClass('invalid') 
     ; 
     } 
     else { 
     $chat.append('<p><span class="user">' + response.name + ':</span> ' + response.message + '</p>'); 
     } 
     $messageForm.$message.prop('disabled', false).focus(); 
    }, 'json'); 
    }); 
}); 

你的PHP:

<?php 

$json = filter_input(INPUT_POST, "json", FILTER_VALIDATE_BOOLEAN); 

if (($message = filter_input(INPUT_POST, "message", FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW|FILTER_REQUIRE_SCALAR)) !== false) { 
    session_start(); 
    $return = [ 
    "name" => $_SESSION["name"], 
    "message" => htmlspecialchars($message, ENT_QUOTES|ENT_HTML5), 
    ]; 
} 
else { 
    $return = [ "error" => true ]; 
} 

if ($json === true) { 
    header("content-type: application/json"); 
    exit(json_encode($return)); 
} 

var_dump($return); 

?> 
+1

怎么样?当然,除非用JavaScript禁用浏览器。它比PHP中的striptags()或类似的东西好得多。 – Dave

+1

绝对不是这里的问题,因为如果这将是一个正常的形式与textarea任何提交将达到PHP不变。 – Fleshgrinder

+1

确实如此,您在输入的客户端验证方面的尝试将无法正常工作,并且他会回到方格之一,并且标记为打破其应用程序的html标记。他们需要通过PHP解析每次任何人使用JavaScript验证超过“这个盒子填充”应该被拍摄它太容易被绕过。 – Dave