Очистка HTML с помощью TinyMCE 4 или HTMLPurifier

У меня есть форма с полем описания, которое использует TinyMCE 4 для редактирования текста и изображений.

Ниже приведены мои конфигурации для TinyMCE:

tinymce.init({
    selector: '.tinymce',
    formats: {
        bold: [
            {inline: 'span', styles: {fontWeight: 'bold'}}
        ],
        italic: [
            {inline: 'span', styles: {fontStyle: 'italic'}}
        ],
        underline: [
            {inline: 'span', styles: {textDecoration: 'underline'}, exact: true}
        ],
        strikethrough: [
            {inline: 'span', styles: {textDecoration: 'line-through'}, exact: true}
        ]
    },
    width: '80%',
    height: 200,
    menubar: false,
    statusbar: false,
    plugins: [
        'advlist autolink save link image lists hr',
        'wordcount visualblocks visualchars code media',
        'table contextmenu directionality textcolor colorpicker'
    ],
    toolbar1: 
        'styleselect | bold italic underline subscript superscript strikethrough removeformat | forecolor backcolor | ' + 
        'fontselect | bullist numlist | alignleft aligncenter alignright alignjustify | table | ' + 
        'link unlink image hr | code',
    toolbar_items_size: 'small',
    style_formats: [
        { title: 'Header 1', block: 'h1' }, { title: 'Header 2', block: 'h2' }, { title: 'Header 3', block: 'h3' },
        { title: 'Header 4', block: 'h4' }, { title: 'Header 5', block: 'h5' }, { title: 'Header 6', block: 'h6' }
    ],
    allow_conditional_comments: false,
    valid_elements: 'a,div,h1,h2,h3,h4,h5,h6,hr,li,ol,p,span[style],sub,sup,table[*],tr[*],td[*],ul,-p',
    extended_valid_elements : 'a[href|target=_blank],img[src|alt|width|height]',
    content_css: [],
    setup: function (editor) {
        // update selector's value when changes are made
        editor.on('change', editor.save);
    }
});

Когда форма отправляется, поле описания очищается с помощью HTMLPurifier.

Ниже приведены мои настройки для HTMLPurifier:

$config = HTMLPurifier_Config::createDefault();
$config->set('Core.Encoding', 'UTF-8');
$config->set('HTML.ForbiddenElements', array('applet','embed','iframe','link','script','style','object'));
$config->set('AutoFormat.RemoveEmpty', true);
$config->set('Core.RemoveInvalidImg', true);
$config->set('URI.AllowedSchemes', array('data' => true)); // allow data URIs
$purifier = new HTMLPurifier($config);

Когда данные вводятся в описание, можно использовать вложенные теги span. Например:

<h1><span style="text-decoration: underline; color: #ff6600;"><span style="font-weight: bold; font-style: italic;">sddfdsdfdhjhjkhjkh</span></span></h1>

Вопрос. Есть ли способ очистить HTML (используя TinyMCE или HTMLPurifier), чтобы, например, стили сворачиваются всякий раз, когда это возможно?

<h1><span style="text-decoration: underline; color: #ff6600; font-weight: bold; font-style: italic;">sddfdsdfdhjhjkhjkh</span></h1>

Или лучше:

<h1 style="text-decoration: underline; color: #ff6600; font-weight: bold; font-style: italic;">sddfdsdfdhjhjkhjkh</h1>

person Mikey    schedule 23.03.2016    source источник
comment
Я посмотрю на ваш вопрос завтра и может помочь вам   -  person maytham-ɯɐɥʇʎɐɯ    schedule 29.03.2016
comment
Я ответил, и вы тоже получили мой голос   -  person maytham-ɯɐɥʇʎɐɯ    schedule 29.03.2016


Ответы (2)


Поскольку вы получили другой ответ, для этого невозможно использовать HTML Purifier.

Но все же можно сделать вспомогательную функцию, которая будет делать то, что вы хотите.

Используя preg_replace и regex, мы можем создать следующую функцию, которая удалит диапазоны и получит результат, который вы просили:

function filterSpan($content)
{
    return preg_replace('/(><span)|(<\/span>)/', '', $content);
}

Это ваш нефильтрованный пример ввода:

$content = '
<h1><span style="text-decoration: underline; color: #ff6600; 
font-weight: bold; font-style: italic;">sddfdsdfdhjhjkhjkh</span></h1>
';

А вот вывод после вызова filterSpan($content):

<h1 style="text-decoration: underline; color: #ff6600; 
font-weight: bold; font-style: italic;">sddfdsdfdhjhjkhjkh</h1>
person maytham-ɯɐɥʇʎɐɯ    schedule 29.03.2016
comment
Хм.. это довольно простое решение. Хотя это может создать недопустимую разметку, если диапазоны имеют другие атрибуты. К счастью, нет. Спасибо! - person Mikey; 29.03.2016

HTML Purifier не имеет такой возможности, извините! Я даже не уверен, как это реализовать; существует множество комбинаций вложенных диапазонов с отдельными стилями, которые нельзя свернуть таким образом.

person Edward Z. Yang    schedule 27.03.2016
comment
это был ответ или комментарий? - person maytham-ɯɐɥʇʎɐɯ; 28.03.2016
comment
Это ответ. Вы не можете сделать это с помощью HTML Purifier. Может быть, вы могли бы реализовать это самостоятельно. - person Edward Z. Yang; 29.03.2016
comment
Но я не ОП, просто следил за этим вопросом - person maytham-ɯɐɥʇʎɐɯ; 29.03.2016
comment
Не извиняйтесь, вы написали эту потрясающую библиотеку, которая, надеюсь, когда-нибудь будет иметь такую ​​возможность. - person Mikey; 29.03.2016