У меня есть сайт, на котором пользователи могут публиковать материалы (как в форумах, комментариях и т. Д.), Используя индивидуальную реализацию TinyMCE. Многим из них нравится копировать и вставлять из Word, что означает, что их вход часто приходит с множеством связанных встроенных форматирования MS.
Я не могу просто избавиться от <span whatever>
поскольку TinyMCE полагается на тег span для некоторого его форматирования, и я не могу (и не хочу) заставлять упомянутых пользователей использовать функцию «Вставить из слова» TinyMCE (что, похоже, не так хорошо работает).
Кто-нибудь знает библиотеку / класс / функцию, которая позаботится об этом для меня? Это должна быть общая проблема, хотя я не могу найти ничего определенного. Недавно я думал, что ряд регулярных выражений грубой силы, которые ищут шаблоны, специфичные для MS, может сделать трюк, но я не хочу переписывать то, что уже доступно, если только не нужно.
Кроме того, исправление фигурных кавычек, em-тире и т. Д. Было бы неплохо. У меня есть свой собственный материал, чтобы сделать это сейчас, но я бы просто хотел найти один фильтр MS-преобразования, чтобы управлять ими всеми.
HTML Purifier создаст стандартную совместимую разметку и отфильтрует множество возможных атак (например, 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, вы можете просто указать, что вам разрешены теги.