Элемент белого списка с классом, использующим htmlpurifier - PullRequest
2 голосов
/ 15 апреля 2010

Я хочу разрешить элемент span только тогда, когда он имеет определенный класс в htmlpurifier

Кто-нибудь знает, как это сделать, сейчас у меня есть

  $config->set('HTML.Allowed','a[href],p,ol,li,ul,img[src],blockquote,em,span[class]');
  $config->set('Attr.AllowedClasses',"allowed");

но это разрешает все промежутки и разрешает только разрешенный класс. Мне нравится, что он разрешает только «разрешенный» класс, но я хочу, чтобы он разрешал span, только если значение его класса «позволено»

спасибо

Ответы [ 4 ]

4 голосов
/ 15 апреля 2010

Специальное решение: переопределите класс в необходимом диапазоне и установите его так, чтобы он имел N возможных значений. Выполнение этого требования приведет к удалению тега, если он не существует.

2 голосов
/ 16 апреля 2010

Хорошо, так что, основываясь на предложении Ambush-comander , я смог удалить все промежутки, у которых не было определенного класса, идея состоит в том, что если требуемый класс, то элемент не имеет этого класса. элемент будет удален.

Я провел некоторое исследование и обнаружил страницу настройки htmlpurifier , которая объясняет, как добавить атрибут в соответствии с их инструкциями. Мне нужно всего лишь четыре дополнительных строки кода, поэтому вот как я это сделал

 // more configuration stuff up here
    $config->set('HTML.DefinitionID', 'enduser-customize.html editor');
    $config->set('HTML.DefinitionRev', 1);
    $def = $config->getHTMLDefinition(true);
    $def->addAttribute('span', 'class*', new HTMLPurifier_AttrDef_Enum(
      array('allowed')
    ));
 // purify down here

класс * in делает класс обязательным, и потому что мы разрешаем только «разрешенному» классу все остальное чередуется. Теперь есть одно предостережение, чтобы сделать это таким образом. если кто-то поместит этот класс в span, то в моем случае это будет разрешено, я на самом деле не использую «позволено», я использую что-то еще, что будет заменено html очистителем

чей-то еще

и спасибо засадам и pinkgothic за их помощь!

1 голос
/ 15 апреля 2010

Вы оставили комментарий на мой похожий вопрос . У меня все еще нет решения из-за порядка инжекторов / очистки, который в моем случае является ключевым, но решение для инжекторов должно работать для вас, поскольку вы не зависите от «предварительной обработки» так сказать.

Насколько я вижу, у вас есть два приличных три полных четыре варианта:

  1. Вы можете использовать решение для атрибутов в моем вопросе, чтобы очистить все атрибуты, если вы не возражаете против оставшихся тегов <span> и </span> в вашем HTML. Если вы не возражаете против них, вы могли бы объединить это решение с инжектором для удаления пустых тегов , хотя тогда порядок выполнения очень, очень вероятно, повредит вам заново. (Так что я представляю. Если нет - превосходно, у вас есть свой ответ! :))

  2. Вы можете использовать инжекторы. Это довольно обширная и подробная особенность HTML Purifier, поэтому я не могу придумать пример, который поможет вам исправить все сразу. Но! Возможно, вы захотите взглянуть на ветку на форуме HTML-очистителя, где был создан инжектор Linkify , это довольно подробное исследование по этой теме, не говоря уже о том, что инжектор, о котором я упоминал в № 1, мог бы помочь вам понять их тоже.

  3. То, что я сейчас исследую для своих целей, - это встроенные в PHP методы DOM . Это хорошая альтернатива, если № 1 и № 2 по какой-то причине подведут вас, но, конечно, дорого обходятся без ресурсов.

  4. Регулярные выражения. Я действительно только упоминаю это как последнее средство, и это даже не серьезное предложение. Вероятно, было бы достаточно безопасно использовать регулярное выражение в уже очищенном HTML, но это кажется пустой тратой хорошего HTML-парсера. (Но тогда, по общему признанию, так же # 3.)

Удачи.

0 голосов
/ 15 апреля 2010

В документации нет ничего о настройке значений атрибутов.Однако, если вы используете class только один раз, я думаю, что не будет никаких проблем, если вы будете делать, как написали.;)

...