¿Cómo puedo permitir HTML en una lista blanca con PHP?

Sé que hay muchos debates durante años sobre los mejores métodos para filtrar datos con PHP, pero me gustaría ir al enfoque de lista blanca en mi proyecto actual.

Solo quiero que un usuario pueda usar el siguiente HTML

bold italics underline strikethrough Big size Small size Hyperlink website A Bulleted List: 
  • One Item
  • Another Item
An Ordered List:
  1. First Item
  2. Second Item
Because it is indented

Heading 1

Heading 2

Heading 3

¿Alguien me puede mostrar el mejor método para hacer esto para el rendimiento en PHP? Sólo en el pasado he permitido todos los códigos HTML menos ciertos

La solución más simple sería strip_tags(), que acepta un segundo argumento que contiene tags permitidas:

 strip_tags($string, "
    1. ");

Creo que la biblioteca de purificadores de HTML funcionará bien:

http://htmlpurifier.org/

HTML Purifier es una biblioteca de filtros HTML compatible con los estándares escrita en PHP. HTML Purifier no solo eliminará todo el código malicioso (mejor conocido como XSS) con una lista blanca completamente auditada, segura pero permisiva, sino que también se asegurará de que sus documentos cumplan con los estándares, algo que solo se puede lograr con un conocimiento completo de las especificaciones de W3C. ¿Cansado de usar BBCode debido al outlook actual de filtros HTML deficientes o inseguros? ¿Tiene un editor WYSIWYG pero nunca ha podido usarlo? ¿Está buscando componentes de código abierto de alta calidad y que cumplan con los estándares para la aplicación que está creando? Purificador de HTML es para ti!

Otra ruta es usar strip_tags con el segundo argumento.

http://php.net/manual/en/function.strip-tags.php

Ejecutaría el código enviado a través de tidy para normalizarlo primero, y luego utilizaría xpath o aplicaría xslt para seleccionar solo los elementos permitidos. De esta manera, nada puede filtrarse. Tenga en cuenta, también, que en cualquier sitio web dado, es probable que tenga miles, sino cientos de miles de solicitudes de lectura para cada solicitud de escritura [que use tidy y xpath / xslt], por lo que, en promedio, el impacto en el rendimiento es insignificante. Si está haciendo el procesamiento por lotes por otro lado ..

Edición: oh y: NO hagas esto con expresiones regulares. Es matemáticamente imposible hacerlo correctamente.