Função PHP para retirar etiquetas, exceto uma lista de tags e atributos na lista branca

Eu tenho que tirar todas as tags e atributos HTML de uma input de usuário, exceto aqueles considerados “seguros” (ou seja, uma abordagem de lista branca).

strip_tags () tira todas as tags, exceto as que estão listadas no parâmetro $allowable_tags . Mas eu também preciso tirar todos os atributos não especificados na lista branca; Por exemplo, eu quero permitir a marca , mas não quero permitir o atributo onclick por razões óbvias.

Existe uma function para fazer isso, ou vou ter que fazer o meu?

Tanto quanto eu sei, a solução strip_tags é sobre a maneira mais rápida de se livrar de tags indesejadas e bloquear pacotes de terceiros, verificando atributos permitidos seria bastante fácil em DOMDocument,

 $string = strip_tags($string,''); $dom = new DOMDocument(); $dom->loadHTML($string); $allowed_attributes = array('id'); foreach($dom->getElementsByTagName('*') as $node){ for($i = $node->attributes->length -1; $i >= 0; $i--){ $attribute = $node->attributes->item($i); if(!in_array($attribute->name,$allowed_attributes)) $node->removeAttributeNode($attribute); } } var_dump($dom->saveHTML()); 

Não há nenhuma function para isso, então você provavelmente terá que escrever uma. Talvez, uma expressão regular faça o truque.