2015-03-08 3 views
2

Я разрабатываю систему чата php с mysqli, где один из моих кодов чата - <3, как и Facebook.Как разбить теги, но сохранить непревзойденные `<` коды

Проблема

Моя проблема заключается в том, что, когда я не добавить полосы теги к сообщению, передаваемому членом, если сообщения <script> alert('What is this'); ?> отображается исходный текст. Но когда я добавляю

<?php $message = strip_tags($message); ?> 

... он удаляет тег из сообщения, но и ломает <3. Я также пробовал htmlentities и htmlspecialchars, но они оба конвертируют <3 в свою форму html.

ВОПРОС

Как я могу лишить мое сообщение из тегов, но по-прежнему позволяют коды с помощью непревзойденной <, такие как <3? Например <script> должно быть разрешено но не</script> и <?php ?>не должно быть разрешено но <anything должно быть разрешено.

+0

Я отредактировал ваш вопрос для наглядности, но есть несколько моментов, на которые я не был уверен. Что вы имеете в виду, когда говорите, что '<3'« не может работать »? (Я заменил «перерывы», что имеет смысл, но слишком расплывчато.) Кроме того, не совсем ясно (по крайней мере, для меня), что общий фактор между «<ничего» и «

0

(Оговорка: я никогда не использовал PHP или MSQLI, так что возможно, я понятия не имею, о чем я говорю.)

Рассматривали ли вы предварительной обработки сообщений, предназначенных для сканирования для символьных комбинаций вы хотите «сохранить» из метки-зачистки до, передавая строку теге-стриптизершу?

Я не знаю, как работает тег-стриппер, но я предполагаю, что он включает в себя некоторый способ избежать символов <, чтобы они не были признаны в качестве тегов. Если вы ищете строки сообщений для последовательности <3 и вставьте \, чтобы они стали \<3, что делает этот стриптиза для тегов? Будет ли это соответствовать вашим потребностям?

Если вы не можете избежать специальных кодов, вы можете просто заменить их чем-то, что не похоже на HTML. Например, сообщение

пользователя: I <3 <b>You</b>! Предварительно обработанный вариант (поиск и замену): I ###HEART### <b>You</b>! Pass помечать-стриптизерша: I ###HEART### You! Наконец, замените ###HEART### с символом сердца.

EDIT: Согласно ответу Petroff, это, вероятно, лучше использовать &#60;3 (который является HTML-код для <3).


Если символы вы выводя являются юникода точки, например, если <3 должен стать U-2665, почему бы просто не выполнить что поиск и замена сначала? Точка unicode не будет включать <, поэтому она не будет распознана как тег.