#javascript #jquery
#javascript #jquery
Вопрос:
Мне нужно использовать javascript для удаления всех html-тегов, за исключением тех, которые я явно разрешаю. У меня есть форма, которая допускает только следующие теги и соответствующие им конечные теги:
<b> <strong> <i> <em> <u> <br> <pre>
<blockquote> <ol> <ul> <li>
<a href="http://www.somesite.com">link</a>
Вся остальная разметка должна быть удалена. Я искал, но нашел только случаи, когда все теги удалены или удален один тег. Можно ли это сделать просто? Я не могу использовать PHP, должен быть javascript. Какие-либо решения?
Спасибо!
Комментарии:
1. Нет. Вы должны использовать PHP, иначе ваши меры безопасности бесполезны.
2. Если это что-то для интрасети, я не думаю, что безопасность является проблемой. Просто функциональность. Но да, нет перехода на javascript…
3. В качестве упражнения на JavaScript да, я уверен, что вы могли бы написать несколько регулярных выражений для поиска тегов и удаления их, если их нет в вашем списке разрешенных тегов, но, как было указано, для реального приложения вы должны делать это на стороне сервера. Я бы серьезно рассмотрел возможность предотвращения / удаления всех HTML-тегов в угловых скобках и вместо этого разрешил теги в стиле BBCode / forum в квадратных скобках, где только определенные вами теги преобразуются в реальные HTML-теги для последующего отображения.
4. вам лучше использовать какую-нибудь серверную часть, либо PHP / ASP, либо что-то еще
Ответ №1:
jQuery.fn.removeTags = function()
{
this.each(function()
{
if(jQuery(this).children().length == 0)
{
jQuery(this).replaceWith(jQuery(this).text());
}
else
{
jQuery(this).children().unwrap();
}
});
return this;
};
jQuery("#container").find(":not(b, strong, i, em, u, br, pre, blockquote, ul, ol, li, a)").removeTags();
Убедитесь, что контейнер не находится выше body
тега. Или у вас могут возникнуть проблемы, когда он удаляет теги head
, html
script
и т.д.
Также, если вы хотите, чтобы :not мог быть списком, и вы могли бы:
var mylist = ["b" ,"strong", ... etc. etc.];
jQuery(":not(" mylist.join(", ") ")").removeTags();
Или даже поместите это в функцию removeTags. (возможности безграничны … )
РЕДАКТИРОВАТЬ: как некоторые отметили в комментариях: Javascript может быть отключен. Другое дело, я предположил, что вы хотели сохранить всю внутреннюю информацию. Если нет, то достаточно просто удалить(), как предлагает megakorre.
Комментарии:
1. Хотя это работает, я решил использовать стиль BB-кода и преобразовать их.
Ответ №2:
итак, в первую очередь вы делаете это, используя все формы контроля безопасности
вы можете поместить содержимое в div и вызвать
$('#container :not(b, strong, em, u, br, pre, blockquote, ol, ul, li, a)').remove();
var res = $("#container").html();
Ответ №3:
Как указано в комментариях, это не может быть сделано безопасно. Обойти фильтр javascript будет очень легко. Это должно быть реализовано на стороне сервера.