Tengo el siguiente código html:

<html>
 <body>
 bla bla bla bla
  <div id="myDiv"> 
         more text
      <div id="anotherDiv">
           And even more text
      </div>
  </div>

  bla bla bla
 </body>
</html>

Quiero quitar todo a partir de <div id="anotherDiv"> hasta su cierre <div>. ¿Cómo puedo hacer eso?

  • Parece ser que hay una edición de la guerra en esta página. Por favor aclarar esta pregunta Claro para que los investigadores puedan beneficiarse.
  • Hay una gran diferencia entre la eliminación de un único elemento específico frente a la eliminación de todas las etiquetas con un tagname.
  • Cada regex solución a esta pregunta es incorrecta, para cualquier interpretación de esta pregunta, y se producirá de forma sorprendente en muchas entradas diferentes. Usted necesita un analizador DOM, como el aceptado respuesta utiliza. Si usted pensó que la pregunta que quería tira un <div>, o tira de un elemento por su ID, ni la opción puede realizarse correctamente con una expresión regular.
  • Considere la posibilidad de despojar <div> (por la etiqueta o por ID) de <div data-attr="</div>"></div> con una expresión regular. O <div><script>foo("</div>")</script></div>, o cualquier otro número de casos sencillos que le rompe un regex basado en la solución.
InformationsquelleAutor coderama | 2010-07-22

7 Comentarios

  1. 33

    Con nativo de DOM

    $dom = new DOMDocument;
    $dom->loadHTML($htmlString);
    $xPath = new DOMXPath($dom);
    $nodes = $xPath->query('//*[@id="anotherDiv"]');
    if($nodes->item(0)) {
        $nodes->item(0)->parentNode->removeChild($nodes->item(0));
    }
    echo $dom->saveHTML();
    • lo que tengo que modificar si quiero quitar todas las etiquetas div en un dom?
    • consulte stackoverflow.com/questions/4177376/…
    • sí, esto funciona de maravilla. Siempre he wante dto ser capaz de eliminar una etiqueta html formar una cadena de html como una de jquery $(selector#id).remove(). Esto es simplemente genial!
    • si desea selectores de salida phpQuery, Zend_Dom o QueryPath. Personalmente, prefiero la XPath.
  2. 14

    Puede utilizar preg_replace() como:

    $string = preg_replace('/<div id="someid"[^>]+\>/i', "", $string);
    • esto eliminará todos los divs y no sólo el especificado.
    • No se especifica en ninguna parte que se debe quitar el div con ID=myDiv?
    • Hay alguna forma de eliminar el contenido de interior? por ejemplo, el uso de etiquetas p que va a ser eliminado, pero el contenido de la p etiquetas de los restos.
    • estas rocas, pero es de todos modos hay que quitar el cierre </div> etiqueta?
    • Aquí está una manera simple tira de etiquetas específicas(tanto abiertos & cierre): gist.github.com/tedicela/0b06265eefb8df41cb8256bb3f442916
    • Esta respuesta DEFINITIVAMENTE no hacer lo que el OP requiere. 16 UVs significa que muchos de los investigadores han sido mal informados y no entender la pregunta y/o lo que esta respuesta. Esta respuesta hace mucho más daño que bien. El mensaje general debería ser que los desarrolladores deben utilizar un analizador dom para manipular html válido.
    • La pregunta dice: quiero quitar todo a partir de <div id=»anotherDiv»> hasta su cierre <div>. ¿Cómo puedo hacer eso? Esta respuesta es incorrecta.
    • Esto es incorrecto y no para <div id="someid" data-foo=">">. Usted no puede utilizar una expresión regular para esto.

  3. 5

    El uso de los nativos Manipulación de datos XML de la Biblioteca

    Suponiendo que el contenido html almacenado en la variable $html:

    $html='<html>
     <body>
     bla bla bla bla
      <div id="myDiv"> 
             more text
          <div id="anotherDiv">
               And even more text
          </div>
      </div>
    
      bla bla bla
     </body>
    </html>';

    Para borrar la etiqueta de IDENTIFICACIÓN utilice el siguiente código:

        $dom=new DOMDocument;
    
        $dom->validateOnParse = false;
    
        $dom->loadHTML( $html );
    
        //get the tag
    
        $div = $dom->getElementById('anotherDiv');
    
       //delete the tag
    
        if( $div && $div->nodeType==XML_ELEMENT_NODE ){
    
            $div->parentNode->removeChild( $div );
        }
    
        echo $dom->saveHTML();

    Tenga en cuenta que algunas versiones de libxml requieren un doctype a estar presente con el fin de utilizar el getElementById método.

    En ese caso puede anteponer $html con <!doctype>

    $html = '<!doctype>' . $html;

    Alternativamente, como el propuesto por Gordon respuesta, puede utilizar DOMXPath para buscar el elemento mediante el xpath:

    $dom=new DOMDocument;
    
    $dom->validateOnParse = false;
    
    $dom->loadHTML( $html );
    
    $xp=new DOMXPath( $dom );
    
    $col = $xp->query( '//div[ @id="anotherDiv" ]' );
    
    if( !empty( $col ) ){
    
        foreach( $col as $node ){
    
            $node->parentNode->removeChild( $node );
    
        }
    
    }
    
    echo $dom->saveHTML();

    El primer método funciona independientemente de la etiqueta. Si desea utilizar el segundo método con el mismo id pero una etiqueta diferente, digamos form, simplemente reemplazar //div en //div[ @id="anotherDiv" ] por ‘//form

  4. 0

    strip_tags() la función es lo que usted está buscando.

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

    • trip_tags() no funciona de la manera que él desea. strip_tags() permite ciertas exclusiones, pero ¿por qué usar que cuando sólo desea excluir una etiqueta y que incluya todas las demás etiquetas
    • A partir de su pregunta, realmente no podría decir cuál de las etiquetas que él estaba tratando de quitar. Parecía como si él quería quitar todo. Gracias por el aporte.
    • Ahhh, a través de chrome. Su en línea de marcado no se muestran. Acabo de comprobar que en firefox y veo su en línea de marcado. Estás en lo correcto 🙂 razón Alguna por la que no se muestran en chrome?
    • strip_tags() funcionado mejor para mí. Gracias. La razón por la que ha funcionado mejor para mí, porque yo tenía las etiquetas que no tenía espacios. Era el más fácil por el momento. gracias.
    • Esta es la respuesta correcta a la pregunta equivocada.
    • La pregunta dice: quiero quitar todo a partir de <div id=»anotherDiv»> hasta su cierre <div>. ¿Cómo puedo hacer eso? Esta respuesta es incorrecta.

  5. -1

    Escribí estas a la franja específica de etiquetas y atributos. Ya que estamos regex no son 100% garantizado para funcionar en todos los casos, pero era un intercambio justo para mí:

    //Strips only the given tags in the given HTML string.
    function strip_tags_blacklist($html, $tags) {
        foreach ($tags as $tag) {
            $regex = '#<\s*' . $tag . '[^>]*>.*?<\s*/\s*'. $tag . '>#msi';
            $html = preg_replace($regex, '', $html);
        }
        return $html;
    }
    
    //Strips the given attributes found in the given HTML string.
    function strip_attributes($html, $atts) {
        foreach ($atts as $att) {
            $regex = '#\b' . $att . '\b(\s*=\s*[\'"][^\'"]*[\'"])?(?=[^<]*>)#msi';
            $html = preg_replace($regex, '', $html);
        }
        return $html;
    }
    • Regex es DOM-ignorante y es propensa a errores. El uso de un legítimo DOM técnica de análisis será más robusto, confiable y escalable. Reiteró preg_ llamadas va a ser ineficiente. El m patrón modificador es de ninguna utilidad.
    • Esta respuesta no se dirige a la etiqueta con la id como se indica en la pregunta. Esta respuesta es incorrecta porque con eliminar los elementos que no deben ser eliminadas.
  6. -1

    ¿qué hay de esto?

    //Strips only the given tags in the given HTML string.
    function strip_tags_blacklist($html, $tags) {
        $html = preg_replace('/<'. $tags .'\b[^>]*>(.*?)<\/'. $tags .'>/is', "", $html);
        return $html;
    }
    • Regex es DOM-ignorante y es propensa a errores. El uso de un legítimo DOM técnica de análisis será más robusto, confiable y escalable. No hay ninguna razón para declarar $html (de un solo-uso de la variable); sólo return preg_replace(...); Este fragmento se producirá cuando un atributo de etiqueta de valor contiene >. No hay necesidad de utilizar una captura de grupo.
    • Esta respuesta no se dirige a la etiqueta con la id como se indica en la pregunta. Esta respuesta es incorrecta porque con eliminar los elementos que no deben ser eliminadas.
    • Esto es incorrecto y no para muchos tipos de entrada, por ejemplo strip_tags_blacklist('<script>let x = "<div>"></script><div>foo</div>', 'div') => <script>let x = ". Usted no puede utilizar expresiones regulares para la tira o de otra manera interactuar con HTML.
  7. -1

    Siguientes RafaSashi la respuesta usando preg_replace(), he aquí una versión que funciona para una sola etiqueta o un array de etiquetas:

    /**
     * @param $str string
     * @param $tags string | array
     * @return string
     */
    
    function strip_specific_tags ($str, $tags) {
      if (!is_array($tags)) { $tags = array($tags); }
    
      foreach ($tags as $tag) {
        $_str = preg_replace('/<\/' . $tag . '>/i', '', $str);
        if ($_str != $str) {
          $str = preg_replace('/<' . $tag . '[^>]*>/i', '', $_str);
        }
      }
      return $str;
    }
    • La pregunta dice: quiero quitar todo a partir de <div id=»anotherDiv»> hasta su cierre <div>. ¿Cómo puedo hacer eso? Esta respuesta es incorrecta.
    • Esta respuesta no se dirige a la etiqueta con la id como se indica en la pregunta. Esta respuesta es incorrecta porque con eliminar los elementos que no deben ser eliminadas.

Dejar respuesta

Please enter your comment!
Please enter your name here