2016-01-19 2 views
0
$config->set('URI.AllowedSchemes', array('data' => true, 'http' => true)); 

$config->set('HTML.AllowedElements', array(
    'a', 'img' 
)); 

$config->set('HTML.AllowedAttributes', array(
    'a.href', 'img.src' 
)); 

У меня есть конфигуратор htmlpurifier, как указано выше. Я хочу, чтобы URI.AllowedSchemes применял определенный тег html. Например, img тег может иметь только данные, а тег a может содержать только http. Есть ли способ достичь этого?htmlpurifier разрешает схему для определенных тегов

+0

Я не думаю, что вы можете сделать это с настройкой, но вы можете написать свой собственный класс обработки атрибутов для 'img' и' a'. Возможно, посмотрите http://stackoverflow.com/questions/2638640/html-purifier-removing-an-element-conditional-based-on-its-attributes и посмотрите, поможет ли это вам? (Я только комментирую и не отвечаю, потому что это довольно полузасушливый ответ, но я надеюсь, что это поможет вам.) – pinkgothic

ответ

0

Это мое решение;

Фильтры;

class ImgSrcTransform extends HTMLPurifier_AttrTransform 
{ 
    protected $parse; 

    public function __construct(){ 
     $this->parser = new HTMLPurifier_URIParser(); 
    } 
    public function transform($attr, $config, $context) 
    { 
     if(!isset($attr['src'])){ 
      return $attr; 
     } 

     $url = $this->parser->parse($attr['src']); 
     if($url->scheme == 'http' || $url->scheme == 'https'){ 
      unset($attr['src']); 
     } 

     return $attr; 
    } 
} 

class LinkHrefTransform extends HTMLPurifier_AttrTransform 
{ 
    protected $parse; 

    public function __construct(){ 
     $this->parser = new HTMLPurifier_URIParser(); 
    } 
    public function transform($attr, $config, $context) 
    { 
     if(!isset($attr['href'])){ 
      return $attr; 
     } 

     $url = $this->parser->parse($attr['href']); 


     if($url->scheme == 'data'){ 
      unset($attr['href']); 
     } 

     return $attr; 
    } 
} 

Использование фильтров;

$config = HTMLPurifier_Config::createDefault(); 
$config->set('URI.AllowedSchemes', array('data' => true, 'http' => true, 'https' => true)); 
$config->set('HTML.AllowedElements', $elements); 
$config->set('HTML.AllowedAttributes', $attributes); 

$htmlDef = $config->getHTMLDefinition(true); 

$img = $htmlDef->addBlankElement('img'); 
$img->attr_transform_pre[] = new ImgSrcTransform(); 

$anchor = $htmlDef->addBlankElement('a'); 
$anchor->attr_transform_pre[] = new LinkHrefTransform(); 

$purifier = new HTMLPurifier($config); 
Смежные вопросы