2015-03-27 10 views
6

Próbuję pozwolić trochę data-attribute z HTMLPurifier dla całego span ale nie sposób ...HTMLPurifier - pozwalają dane attibute

Mam ten ciąg:

<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> 

Moja HTMLPurifier config:

$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); 

ja oczyścić mój $value tak:

$purifier = new \HTMLPurifier($this->HTMLpurifierConfigInverseTransform); 
var_dump($purifier->purify($value));die; 

i otrzymaj:

<span>My Name</span><span>Is Zoobo</span> 

Ale jak oszczędzać atrybuty moje dane id, data-time-start, data-time-end w moim span?

muszę mieć to:

<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> 

starałem się przetestować ten config:

$this->HTMLpurifierConfigInverseTransform->set('HTML.Allowed', 'span[data-time-start],u,strong,em'); 

ale komunikat o błędzie:

użytkownika Ostrzeżenie: Atrybut „data-czas -start 'in element' span 'not obsługiwany (informacje na temat implementacji tego, patrz wsparcie forów)

Dzięki za pomoc !!

EDIT 1

Próbowałam pozwolić identyfikatora w czasie firdt z tej linii kodu:

$this->HTMLpurifierConfigInverseTransform->set('Attr.EnableID', true); 

to nie działa dla mnie ...

EDIT 2

Dla atrybutów data-* dodaję tę linię, ale nic się nie dzieje ened też ...

$def = $this->HTMLpurifierConfigInverseTransform->getHTMLDefinition(true); 
$def->addAttribute('sub', 'data-time-start', 'CDATA'); 
$def->addAttribute('sub', 'data-time-end', 'CDATA'); 

Odpowiedz

7

HTML Purifier jest świadomy struktury HTML i wykorzystuje tę wiedzę jako podstawę swojego białego listingu. Jeśli dodasz standardowy atrybut do białej listy, nie zezwala ona na dowolną treść tego atrybutu - to rozumie atrybuty i będzie nadal odrzucać treść, która nie ma sensu.

Na przykład, jeśli masz gdzieś atrybut, który ma wartości numeryczne, HTML Purifier nadal odmawia HTML, który próbował wprowadzić wartość "foo" dla tego atrybutu.

Jeśli dodasz atrybuty niestandardowe, dodanie go do białej listy nie nauczy HTML Oczyszczanie, jak obsługiwać atrybuty: Jakie dane może oczekiwać w tych atrybutach? Jakie dane są szkodliwe?

Istnieje obszerna dokumentacja, jak można powiedzieć HTML Oczyszczacz o strukturze niestandardowych atrybutów tutaj: Customize

Jest przykład kodu dla „target” atrybut <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'); 

Dodałoby to target jako pole, które akceptuje tylko wartości: , ,i. To trochę bardziej rygorystyczne niż faktyczna definicja HTML, ale w większości przypadków całkowicie wystarczające. To jest ogólne podejście, które należy wykonać dla data-time-start i data-time-end. Aby uzyskać możliwą konfigurację, zapoznaj się z oficjalną dokumentacją HTML Purifier (w powyższym linku). Mój najlepszy przypuszczenie ze swoim przykładzie jest to, że nie chcesz Enum#... ale Number, jak to ...

$def->addAttribute('span', 'data-time-start', 'Number'); 
$def->addAttribute('span', 'data-time-end', 'Number'); 

... ale to sprawdzić i zobaczyć, co pasuje do Twojego przypadków użycia najlepiej. (Gdy jesteś realizacji tego, nie zapomnij trzeba także listy atrybutów w białej liście jako aktualnie robi.)

Dla id, powinien zawierać Attr.EnableID = true w ramach danej konfiguracji.

Mam nadzieję, że to pomoże!

+0

Dzięki za odpowiedź! Po raz pierwszy próbowałem włączyć ID, ale '$ this-> HTMLpurifierConfigInverseTransform-> set ('Attr.EnableID', true);' nie działa ... Wtedy dla specjalnych atrybutów, zobaczę, ale wygląda na to, być dla mnie trudnym ... Jestem debiutantem ... – Zagloo

+0

@Zagloo: Czy upewniłeś się, że podałeś swoją definicję ID i numer rewizji (słabo pamiętam, że nie powoduje to problemów) i wyłączyć pamięć podręczną definicji podczas pracy nad nim? Niestety nie mam pojęcia, dlaczego 'Attr.EnableID' nie będzie działał dla ciebie, poza niezgodnością wersji, ale jest to część HTML Purifier prawie na zawsze, więc nie sądzę, że to jest to. :( – pinkgothic

Powiązane problemy