2009-07-11 16 views
6

que tiene un ID de div gustaría eliminar de una salida que se parece a¿Cómo puedo eliminar un elemento html y su contenido utilizando expresiones regulares

<div id="ithis" class="cthis">Content here which includes other elements etc..) </div> 

¿Cómo puedo eliminar este div y todo dentro de ella usando PHP y expresiones regulares ?

Gracias.

+0

¿Puede seguir elaborando? ¿Esto es en forma de una cuerda? –

+1

¿conoces el nombre o el nombre de la clase? ¿O hay identificadores distintos de la identificación y/o clase para que no elimine todos los divs que caen en esa descripción? ¿O quieres eliminar todos los divs y su contenido? –

Respuesta

13

La respuesta simple es que no. En su lugar, utiliza uno de los muchos analizadores HTML de PHP. Los regex son una forma escamosa y propensa a errores de manipular HTML.

Dicho esto se puede hacer esto:

$html = preg_replace('!<div\s+id="ithis"\s+class="cthis">.*?</div>!is', '', $html); 

Pero muchas cosas pueden mal con esto. Por ejemplo, si un div que contiene:

<div id="ithis" class="cthis">Content here which <div>includes</div> other elements etc..) </div> 

que va a terminar con:

other elements etc..) </div> 

como la expresión regular se detendrá en la primera </div>. Y no, no hay nada que puedas hacer realmente para resolver este problema (con expresiones regulares) consistentemente.

hecho con un programa de análisis se parece más a esto:

$doc = new DOMDocument(); 
$doc->loadHTML($html); 
$element = $doc->getElementById('ithis'); 
$element->parentNode->removeChild($element); 
$html = $doc->saveHTML(); 
+0

+1. Vale la pena comentar que (A) si el elemento no existe, entonces '$ element' es' NULL' y el comando '-> removeChild()' fallará con un error fatal, y (B) puede/puede querer usar el '@' para hacer que '-> loadHTML()' silencie los avisos sobre HTML mal formado: '@ $ doc-> loadHTML ($ html);' –

1

no sé acerca de PHP, pero se puede sustituir /<id.*?<\/id[^>]*>/ sin nada.

0

PHP es del lado del servidor y la salida proviene del servidor. ¿No puedes simplemente no sacarlo? ¿O estás tratando de ocultarlo? Si es así, en una hoja de estilo, solo diga #ithis {display:none}.

Si la cadena es un retorno de alguna función en PHP que no ha escrito Y no desea ensuciar con ese código, tiene que escribir una expresión regular muy difícil para tener en cuenta los divs anidados, sintaxis variable en la salida, etc. Recomiendo usar algún analizador (quizás este Zend Framework component) para ayudarte. Lo he usado algunas veces para algo similar. Aunque si no estás familiarizado con ZF, es posible que quieras probar algo más.

Cuestiones relacionadas