Я пытаюсь разрешить некоторый data-attribute
data с 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>
Но как сохранить мои атрибуты атрибутов 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
Я попытался разрешить идентификатор в это время с помощью этой строки кода:
$this->HTMLpurifierConfigInverseTransform->set('Attr.EnableID', true);
Это не работает для меня …
EDIT 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 Purifier все равно отрицал бы HTML, который пытался ввести значение «foo» для этого атрибута.
Если вы добавите пользовательские атрибуты, просто добавив его в белый список, он не научит HTML Purifier, как обрабатывать атрибуты: какие данные он может ожидать в этих атрибутах? Какие данные являются вредоносными?
Существует обширная документация о том, как вы можете показать HTML Purifier о структуре ваших настраиваемых атрибутов здесь: Настроить
Существует пример кода для атрибута «target» <a>
-tag:
$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
и времени data-time-end
. Для возможной настройки ознакомьтесь с официальной документацией по очистке HTML (как указано выше). Мое лучшее предположение из вашего примера состоит в том, что вы не хотите Enum#...
но Number
, как это …
$def->addAttribute('span', 'data-time-start', 'Number'); $def->addAttribute('span', 'data-time-end', 'Number');
… но проверьте это и посмотрите, что лучше всего подходит для вашего прецедента. (Хотя вы реализуете это, не забывайте, что вам также нужно перечислять атрибуты в белом списке, как вы сейчас делаете.)
Для id
вы должны включить Attr.EnableID = true
качестве части вашей конфигурации.
Надеюсь, это поможет!