PHP для очистки вставленных входных данных Microsoft
У меня есть сайт, на котором пользователи могут публиковать материалы (например, на форумах, в комментариях и т. Д.), Используя настраиваемую реализацию TinyMCE. Многие из них любят копировать и вставлять из Word, что означает, что их ввод часто сопровождается множеством связанных встроенных форматирований MS.
Я не могу просто избавиться от <span whatever>
, так как TinyMCE использует тег span для некоторого его форматирования, и я не могу (и не хочу) заставлять указанных пользователей использовать функцию TinyMCE "Вставить из слова" (которая, похоже, не очень хорошо работает во всяком случае).
Кто-нибудь знает библиотеку/класс/функцию, которая позаботилась бы об этом для меня? Должно быть, это обычная проблема, хотя я не могу найти ничего определенного. Недавно я подумал, что серия регулярных выражений грубой силы, ищущих шаблоны, специфичные для MS, может помочь, но я не хочу переписывать то, что уже может быть доступно, если только я не должен.
Кроме того, было бы неплохо исправить фигурные кавычки, тире и т. Д. У меня сейчас есть свои дела, чтобы сделать это, но я бы действительно просто хотелось бы найти один фильтр MS-преобразования, чтобы управлять ими всеми.
4 answers
Очиститель HTML создаст разметку, соответствующую стандартам, и отфильтрует множество возможных атак (таких как XSS).
Для более быстрой очистки, не требующей фильтрации XSS, я использую расширение PECL Tidy, которое является привязкой для утилиты Tidy HTML.
Если это вам не поможет, я предлагаю вам переключиться на FCKeditor, в котором есть эта встроенная функция .
Веб-сайт http://word2cleanhtml.com / хорошо справляется с преобразованием из Word. Я использую его в PHP, отбрасывая, для обработки некоторых устаревших HTML, и до сих пор он работает довольно хорошо (в результате получается очень чистый код <p>, <b>
). Конечно, будучи внешней службой, нехорошо использовать ее в онлайн-обработке, как в вашем случае.
Если вы попробуете и это приведет к 400 ошибкам, попробуйте сначала отфильтровать HTML с помощью Tidy.
В моем случае была закономерность. Нежелательная часть всегда начиналась с
<!-- [if gte mso 9]>
И заканчивается
<![endif]-->
Поэтому мое решение состояло в том, чтобы вырезать все до и после этого блока:
$array = explode("<!-", $string, 2);
$begin = $array[0];
$end=substr(strrchr($string,'[endif]-->'),10);
echo $begin.$end;
В моем случае это сработало просто отлично:
$text = strip_tags($text, '<p><a><em><span>');
Вместо того, чтобы пытаться вытащить ненужные вам вещи, такие как встроенный xml-файл word, вы можете просто указать разрешенные теги.