Интересная проблема, я потратил некоторое время на ее решение, потому что есть много вещей, которые мы хотим удалить из пользовательского вклада, и даже если я сделаю длинный список вещей, которые нужно удалить, последние в HTML могут развиваться, и мой список будет есть дыры.
Тем не менее я хочу, чтобы пользователи вводили некоторые простые вещи, такие как жирный шрифт, курсив, абзацы ... prety simple.
Нет сомнений в том, что список разрешенных вещей короче, и html может изменить его на последний, что не сделает пробелы в моем списке, если html stop не поддерживает эти простые вещи.
Поэтому начните думать иначе, просто скажите, что вы разрешаете, с большой болью, потому что я не эксперт по регулярным выражениям (поэтому, пожалуйста, некоторые регулярные выражения исправляют меня здесь или улучшают), я закодировал это выражение и его рабочую форму мне еще до появления HTML5. 1001 *
replace(/(?!<[/]?(b|i|p|br)(\s[^<]*>|[/]>|>))<[^>]*>/gi,"")
(b | i | p | br) <- это список разрешенных тегов, не стесняйтесь добавлять некоторые. </p>
это отправная точка, и поэтому некоторые люди с регулярными выражениями должны улучшить, чтобы удалить также атрибуты, такие как onclick
если я сделаю это:
(?!<[/]?(b|i|p|br)(\s*>|[/]>|>))<[^>]*>
теги с onclick или другим материалом будут удалены, но соответствующие закрывающие теги останутся, и после того, как мы не хотим, чтобы эти теги были удалены, мы просто хотим удалить атрибуты тега.
может быть, второй проход регулярного выражения с
(?!<[^<>\s]+)\s[^</>]+(?=[/>])
я прав? это может быть составлено в один проход?
у нас до сих пор нет связи между тегами (открытие / закрытие), до сих пор ничего особенного.
Может ли атрибут удалить быть записать, чтобы удалить все не из белых списков? (возможно да).
последняя проблема .. при удалении тегов, таких как script содержимое остается, желательно при удалении font но не script , что ж, мы можем сделать первый пройти с
<(script|object|embed)[^>]*>.*</\1>
, который удалит определенные теги и их содержимое ... но это черный список, что означает, что вы должны следить за ним в случае изменения html.
примечание: все с "gi"
редактирование:
объединил все вышеперечисленное по этой функции
String.prototype.sanitizeHTML=function (white,black) {
if (!white) white="b|i|p|br";//allowed tags
if (!black) black="script|object|embed";//complete remove tags
e=new RegExp("(<("+black+")[^>]*>.*</\\2>|(?!<[/]?("+white+")(\\s[^<]*>|[/]>|>))<[^<>]*>|(?!<[^<>\\s]+)\\s[^</>]+(?=[/>]))", "gi");
return this.replace(e,"");
}
-черный список -> полное удаление тега и содержимого
-белый список -> сохранить теги
другие теги удаляются, но содержимое тегов сохраняется
все атрибуты тегов белого списка (оставшиеся) удалены
все еще есть место для белого списка атрибутов (не реализованного выше), потому что если я хочу сохранить IMG, тогда src должен остаться ... а как насчет отслеживания изображений?