Я пытаюсь позволить некоторым data-attribute
с htmlPurifier для всех моих span
но никак …
У меня есть эта строка:
<p>
<span data-time-start="1" data-time-end="5" id="5">
<word class="word">My</word>
<word class="word">Name</word>
</span>
<span data-time-start="6" data-time-end="15" id="88">
<word class="word">Is</word>
<word class="word">Zooboo</word>
</span>
<p>
Мой конфиг htmlpurifier:
$this->HTMLpurifierConfigInverseTransform = \HTMLPurifier_Config::createDefault();
$this->HTMLpurifierConfigInverseTransform->set('HTML.Allowed', 'span,u,strong,em');
$this->HTMLpurifierConfigInverseTransform->set('HTML.ForbiddenElements', 'word,p');
$this->HTMLpurifierConfigInverseTransform->set('CSS.AllowedProperties', 'font-weight, font-style, text-decoration');
$this->HTMLpurifierConfigInverseTransform->set('AutoFormat.RemoveEmpty', true);
Я очищаю свой $value
как это:
$purifier = new \HTMLPurifier($this->HTMLpurifierConfigInverseTransform);
var_dump($purifier->purify($value));die;
И получите это:
<span>My Name</span><span>Is Zoobo</span>
Но как сохранить мои атрибуты данных id
, data-time-start
, data-time-end
в моем span
?
Мне нужно иметь это:
<span data-time-start="1" data-time-end="5" id="5">My Name</span data-time-start="6" data-time-end="15" id="88"><span>Is Zoobo</span>
Я попытался проверить с этим конфигом:
$this->HTMLpurifierConfigInverseTransform->set('HTML.Allowed', 'span[data-time-start],u,strong,em');
но сообщение об ошибке:
Предупреждение пользователя: атрибут ‘data-time-start’ в элементе ‘span’ не
поддерживается (для получения информации о реализации этого см. поддержку
форумы)
Спасибо за вашу помощь !!
РЕДАКТИРОВАТЬ 1
Я попытался разрешить ID в первый раз с этой строкой кода:
$this->HTMLpurifierConfigInverseTransform->set('Attr.EnableID', true);
Это не работает для меня …
РЕДАКТИРОВАТЬ 2
За data-*
атрибуты, я добавляю эту строку, но ничего не произошло тоже …
$def = $this->HTMLpurifierConfigInverseTransform->getHTMLDefinition(true);
$def->addAttribute('sub', 'data-time-start', 'CDATA');
$def->addAttribute('sub', 'data-time-end', 'CDATA');
HTML Purifier знает о структуре HTML и использует эти знания в качестве основы своего процесса белого списка. Если вы добавляете стандартный атрибут в белый список, он не допускает произвольного содержимого для этого атрибута — он понимает атрибут и все равно будет отклонять контент, который не имеет смысла.
Например, если у вас где-то есть атрибут, который принимает числовые значения, очиститель HTML все равно будет запрещать HTML, который пытается ввести значение «foo» для этого атрибута.
Если вы добавляете пользовательские атрибуты, простое добавление их в белый список не учит HTML-очистителю, как обрабатывать атрибуты: какие данные можно ожидать в этих атрибутах? Какие данные являются вредоносными?
Есть обширная документация, как вы можете рассказать HTML Purifier о структуре ваших пользовательских атрибутов здесь: Настроить
Есть пример кода для атрибута ‘target’ <a>
-тег:
$config = HTMLPurifier_Config::createDefault();
$config->set('HTML.DefinitionID', 'enduser-customize.html tutorial');
$config->set('HTML.DefinitionRev', 1);
$config->set('Cache.DefinitionImpl', null); // remove this later!
$def = $config->getHTMLDefinition(true);
$def->addAttribute('a', 'target', 'Enum#_blank,_self,_target,_top');
Что бы добавить target
как поле, которое принимает только значения "_blank"
, "_self"
, "_target"
а также "_top"
, Это немного строже, чем фактическое определение HTML, но для большинства целей вполне достаточно.
Это общий подход, который вы должны будете использовать для data-time-start
а также data-time-end
, Для возможной конфигурации, ознакомьтесь с официальной документацией HTML Purifier (как указано выше). Мое лучшее предположение из вашего примера, что вы не хотите Enum#...
но Number
, как это…
$def->addAttribute('span', 'data-time-start', 'Number');
$def->addAttribute('span', 'data-time-end', 'Number');
…но проверьте это и посмотрите, что подходит вашему варианту использования лучше всего. (Пока вы реализуете это, не забывайте, что вам также нужно перечислить атрибуты в белый список, как вы это делаете в настоящее время.)
За id
, вы должны включить Attr.EnableID = true
как часть вашей конфигурации.
Надеюсь, это поможет!
Других решений пока нет …