2010-04-15 5 views
2

Je veux seulement permettre à l'élément span que lorsqu'il a une certaine classe dans htmlpurifierélément whitelist à la classe de, en utilisant htmlpurifier

personne ne sait comment faire, j'ai en ce moment

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

mais qui permet à tous portées et ne permet la classe autorisés J'aime que cela permet seulement le « permis » classe mais je veux seulement pour permettre la durée lorsque la valeur de sa catégorie est « autorisée »

grâce

Répondre

2

Ok, donc basé sur Ambush-comander's suggestion que je pouvais enlever toutes les travées qui n'avaient pas de classe spécifique l'idée est que si la classe exigeait alors l'élément n'a pas cette classe l'élément sera supprimé.

je fait quelques recherches et trouvé htmlpurifier customize la page qui explique comment ajouter un attribut suivant leurs instructions i seulement besoin d'une quatre lignes additonal de code Voici donc ce que je l'ai fait

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

le * en classe rend la classe nécessaire et parce que nous permettons seulement la classe "autorisée" tout le reste est rayé. maintenant, il y a un avertissement à faire de cette façon. si quelqu'un a mis cette classe là-dedans alors enjamber il serait permis dans mon cas, je ne suis pas vraiment en utilisant « permis » J'utilise quelque chose d'autre qui sera remplacé par purificateur html

HTH quelqu'un d'autre

et merci à embuscade et pinkgothic pour toute leur aide!

+1

Très bien, il est bon d'entendre que les docs sont suffisamment clairs pour que mon one-liner puisse se transformer en solution. –

+0

Sahweet. Je peux probablement l'utiliser aussi pour mon cas. Je vais regarder de plus près lundi. Merci d'avoir partagé ça! Commandant @Ambush: Vous êtes comme un super-héros, aces. :] – pinkgothic

+0

@mcgrailm: Génial, j'ai finalement réussi à donner un coup de feu et en combinaison avec le # 1 suggéré, cela fonctionne comme un charme pour moi! : D Merci beaucoup de partager ça! Eee, HTML Purifier * et * un oneliner (enfin, sorte de!). Je suis au paradis! – pinkgothic

0

Dans la documentation, il n'y a rien sur la configuration des valeurs d'attributs. Cependant si vous utilisez class seulement une fois je pense qu'il n'y aura pas de problème si vous allez faire comme vous l'avez écrit. ;)

+0

travées montrent encore jusqu'à c'est le problème que j'ai seulement bloque la classe qui ne sont pas « autorisés », mais laisse à chaque travée dans la porte – mcgrailm

+0

désolé pour but de mettre cela sur un autre poste – mcgrailm

1

Vous avez laissé un commentaire à my similar question. Je n'ai toujours pas de solution, en raison de l'injecteur/ordre de purification qui dans mon cas est pivotant, mais la solution d'injecteur devrait fonctionner pour vous, puisque vous ne dépendez pas de 'pré-traitement', pour ainsi dire .

Pour autant que je peux voir, vous avez deux décents trois complets quatre options:

  1. Vous pouvez utiliser la solution d'attribut dans ma question à blanc tous les attributs si vous ne me dérange pas restes <span> et </span> dans votre code HTML. Si cela vous dérange, vous pouvez combiner cette solution avec an empty-tag-stripping injector, bien que l'ordre d'exécution soit très, très susceptible de vous paralyser à nouveau. (Donc j'imagine, si non - superbe, vous avez votre réponse! :))

  2. Vous pouvez utiliser des injecteurs. Ils sont une fonctionnalité assez complète et détaillée de HTML Purifier, donc je ne peux pas imaginer un exemple qui va réparer les choses pour vous hors de la boîte. Mais! Vous voudrez peut-être regarder the thread on the HTML Purifier forum where the injector 'Linkify' was created, c'est une prise assez approfondie sur le sujet, sans parler de l'injecteur que j'ai mentionné dans # 1 pourrait vous aider à les comprendre, aussi.

  3. Quelque chose que j'étudie en ce moment pour mes buts sont les méthodes DOM intégrées de PHP. Ceci est une alternative solide si # 1 et # 2 vous échouent pour une raison quelconque, mais bien sûr coûteux en ce qui concerne les ressources.

  4. Expressions régulières. Je ne fais que mentionner cela en dernier recours et ce n'est même pas une suggestion sérieuse. Il serait probablement assez sûr d'utiliser une regex sur déjà purifié HTML, mais il semble que ce soit un tel gaspillage d'un bon parseur HTML. (Mais alors, il faut l'admettre, il en est de même pour le numéro 3.)

Bonne chance.

+0

ok si options 2 ressemble à la bonne direction. En supposant que j'écris le code de l'injecteur où dois-je mettre le fichier de classe et comment puis-je l'inclure? Je n'ai jamais fait de classe avant 8^( – mcgrailm

+0

Vous placeriez le fichier de classe sous 'library/HTMLPurifier/Injector' et lui donneriez un nom de fantaisie, par exemple' FancyName.php' La classe elle-même serait 'HTMLPurifier_Injector_FancyName'. (ou, plutôt, en utilisant) cela fonctionne en disant à HTML Purifier de l'utiliser via sa configuration: '$ config-> set ('AutoFormat.Custom', array ('FancyName'));' devrait faire l'affaire. '$ config-> set ('AutoFormat.Custom', array (nouveau HTMLPurifier_Injector_FancyName()));' devrait le faire – pinkgothic

+0

Pour l'instant, j'utilise une solution DOMDocument pour mon propre problème, soit dit en passant. jetez un oeil, je l'ai posté comme une réponse: http://stackoverflow.com/questions/2638640/html-purifier-removing-an-element-conditionally-based-on-its-attributes/2647388#2647388 - mais si vous pouvez le résoudre en utilisant un injecteur, vous devriez le faire, c'est juste un avertissement, – pinkgothic

4

Solution ad hoc: redéfinissez la classe dans l'étendue à définir et définissez-la sur N valeurs possibles. Si cela est requis, l'étiquette sera supprimée si elle n'existe pas.

+0

thats sonne bien comment puis-je le faire – mcgrailm

+0

je l'ai eu !!! Je ne sais pas comment je devrais montrer comment cela est fait si je devais éditer mon post ou le fournir dans une réponse – mcgrailm

+1

@mcgrailm: Vous pouvez répondre à votre propre question et même accepter que la bonne réponse. :) – pinkgothic