2012-06-23 45 views
6

Uso la función strip_tags() pero necesito eliminar algunas etiquetas (y todos sus contenidos).PHP: strip_tags - ¿eliminar solo ciertas etiquetas (y sus contenidos)?

por ejemplo:

<div> 
    <p class="test"> 
    Test A 
    </p> 
    <span> 
    Test B 
    </span> 
    <div> 
    Test C 
    </div> 
</div> 

Digamos, que necesito para deshacerse de la P y etiquetas SPAN, y sólo mantienen:

<div> 
    <div> 
    Test C 
    </div> 
</div> 

strip_tags Espera como segundo parámetro de las etiquetas que se querer guardar.

En este ejemplo en particular podría usar striptags($html, "<div>"); pero el html que estoy raspando y las etiquetas que deben eliminarse son diferentes todo el tiempo.

Busqué horas para una función que se adapta a mis necesidades, pero no pude encontrar nada útil.

¿Alguna idea?

+2

Comience con [DOM] (http://php.net/dom) y [XPath] (http://uk.php.net/manual/en/class.domxpath.php) – DaveRandom

+1

Pregunta ya respondida aquí: http://stackoverflow.com/questions/9788621/is-there-an-alternative-to-phps-strip-tags – Jocelyn

+0

Intenté la respuesta aceptada en esta publicación pero no estaba satisfecho con los resultados – Dylan

Respuesta

11

Usa una expresión regular. Algo como esto debería funcionar:

$tags = array('p', 'span'); 
$text = preg_replace('#<(' . implode('|', $tags) . ')>.*?<\/$1>#s', '', $text); 

El demo muestra que la sustitución de las etiquetas deseadas sin nada.

Tenga en cuenta que puede necesitar ajustarlo más, por ejemplo, para compensar el espacio en blanco dentro de las etiquetas u otras incógnitas que su ejemplo no muestra.

Aquí es la expresión regular a utilizar para capturar etiquetas con o sin atributos:

'#<(' . implode('|', $tags) . ')(?:[^>]+)?>.*?<\/$1>#s' 
+0

@Downvoter - Cualquier comentario como ¿Por qué mi respuesta funcional fue downvoted? – nickb

+2

Gracias, esto es perfecto para mi situación. Estoy raspando HTML usando un analizador html dom simple y solo necesito un poco de extracción adicional. – Dylan

+0

ACTUALIZACIÓN: esta expresión regular solo elimina etiquetas únicas sin atributos ... lo siguiente parece funcionar: $ text = preg_replace ('# <('. Implode ('|', $ tags). '). *>. *? #s ',' ', $ text); – Dylan

1

Usted dice que está utilizando DOM HTML simple (! Buena Esa es la manera correcta de analizar HTML). Cuando necesito para quitar una etiqueta y su contenido, lo hago:

$rows = $html->find("span"); 

foreach ($rows as $row) 
{ 
    $row->outertext = ""; 
} 

$html->load($html->save()); 

Se requiere que la última línea debido a que el DOM se confunde después de las modificaciones se hacen para todo el DOM tiene que ser colapsó y luego analizada de nuevo para que la los cambios se hacen permanentes (IMO, un error en el HTML simple DOM).

El enfoque Simple HTML DOM es más seguro y más estable que una expresión regular.

Cuestiones relacionadas