2015-03-27 5 views
6

sto cercando di consentire ad alcuni data-attribute con htmlPurifier per tutta la mia span ma nessun modo ...HtmlPurifier - permettere che i dati attibute

ho questa stringa:

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

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

purifico mia $value in questo modo:

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

E ottenere questo:

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

Ma come conservare gli attributi miei dati id, data-time-start, data-time-end nel mio span?

ho bisogno di avere questo:

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

ho provato a testare con questa configurazione:

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

ma messaggio di errore:

utilizzatori Attenzione: attributo 'i dati in tempo -start 'nell'elemento' span 'non supportato da (per informazioni sull'implementazione, consultare il supporto forum)

Grazie per il vostro aiuto !!

EDIT 1

Ho provato a permettere ID nel tempo firdt con questa linea di codice:

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

non funziona per me ...

EDIT 2

Per gli attributi data-*, aggiungo questa riga ma non succede nulla ened troppo ...

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

risposta

7

HTML Purifier è a conoscenza della struttura di HTML e utilizza questa conoscenza come base del suo processo di bianco-listing. Se aggiungi un attributo standard a una whitelist, non consente contenuti arbitrari per quell'attributo: lo riconosce l'attributo e rifiuterà comunque il contenuto che non ha senso.

Ad esempio, se in qualche parte ci fosse un attributo che ha valori numerici, HTML Purifier negherebbe comunque l'HTML che ha tentato di immettere il valore "foo" per quell'attributo.

Se si aggiungono attributi personalizzati, aggiungendolo semplicemente alla whitelist non viene insegnato a HTML Purifier come gestire gli attributi: Quali dati può aspettarsi in quegli attributi? Quali dati sono dannosi?

C'è un'ampia documentazione come si può dire HTML Purifier sulla struttura del vostro attributi personalizzati qui: Customize

C'è un esempio di codice per l'attributo 'bersaglio' della <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'); 

Ciò aggiungerebbe target come un campo che accetta solo i valori "_blank", "_self", "_target" e "_top". È un po 'più rigoroso della vera definizione HTML, ma per la maggior parte degli scopi è completamente sufficiente.

Questo è l'approccio generale che è necessario prendere per data-time-start e data-time-end. Per la possibile configurazione, consultare la documentazione ufficiale del purificatore HTML (come sopra collegato). La mia ipotesi migliore dal vostro esempio è che non si vuole, ma Enum#...Number, come questo ...

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

... ma check it out e vedere che cosa si adatta al vostro caso d'uso migliore. (Mentre si sta attuazione del presente, non dimenticare è anche necessario elencare gli attributi nella lista bianca come si sta facendo attualmente.)

Per id, si dovrebbe includere Attr.EnableID = true come parte della vostra configurazione.

Spero che questo aiuti!

+0

Grazie per la risposta completa! Ho provato la prima volta per abilitare l'ID ma '$ this-> HTMLpurifierConfigInverseTransform-> set ('Attr.EnableID', true);' non funziona ... Quindi per consentire attributi speciali, lo vedrò ma sembra essere duro per me ... Sono un debuttante ... – Zagloo

+0

@Zagloo: ti sei assicurato di dare alla tua definizione un ID e un numero di revisione (ricordo vagamente di non farlo causa problemi) e di disabilitare la cache delle definizioni mentre ci stai lavorando? Sfortunatamente non ho idea del perché "Attr.EnableID" non funzioni per te, a parte una mancata corrispondenza della versione, ma fa parte del purificatore HTML quasi per sempre, quindi non penso sia così. :( – pinkgothic