2013-10-14 91 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