Convertir un eregi_replace en un preg_replace

Estoy tratando de analizar algunos fragmentos de HTML y quiero limpiarlos por varias razones (XSS et al).

Actualmente estoy tratando de eliminar todos los atributos en cualquier etiqueta, excepto el href en un anclaje. Estoy haciendo esto usando una secuencia de llamadas eregi_replace, pero estoy seguro de que hay una manera más inteligente de hacer esto usando preg_replace y solo un par de líneas de código, pero no he podido hacer que funcione. ¿Alguien puede ayudar?

Código actual:

$data_item = eregi_replace("

]*>","

", $data_item); $data_item = eregi_replace("

]*>","

", $data_item); $data_item = eregi_replace("

]*>","

", $data_item); $data_item = eregi_replace("

]*>","

", $data_item); $data_item = eregi_replace("

]*>","
", $data_item); $data_item = eregi_replace("
]*>","
", $data_item); $data_item = eregi_replace("

(Solo necesito analizar un subconjunto de tags HTML ya que antes eliminé cualquier elemento no deseado).

Solutions Collecting From Web of "Convertir un eregi_replace en un preg_replace"

¿Por qué no usar una expresión regular general que coincidirá con cualquier etiqueta, y luego preg_replace_callback() para permitirle determinar con qué se debe reemplazar una etiqueta determinada? De esta forma, puede tener una función simple que verifique si la etiqueta coincidente es a etiqueta a, y si es así, no reemplace la href, sino reemplace todo.

Alternativamente, podrías hacer algo como esto:

 $data_item = preg_replace("/< (p|h2|h3|h4|h5|h6|ul|ol)[^>]*>/i","< $1>", $dataitem); 

Donde el grupo () en la expresión regular captura el tipo de etiqueta coincidente, el | es el operador “o” para hacer coincidir cualquiera de las tags indicadas, y el $1 en el texto de reemplazo se utiliza para sustituir en lo que coincidió con el primer (y único) grupo de captura del patrón.