2010-03-04 15 views
7

$ str = 'texto tag contenido más texto';cómo eliminar una etiqueta y su contenido utilizando la expresión regular?

Mis preguntas son: ¿Cómo recuperar el contenido tag <em>contents </em> que se encuentra entre <MY_TAG> .. </MY_TAG>?

Y

¿Cómo eliminar <MY_TAG> y su contenido de $str?

Estoy usando PHP.

Gracias.

+3

Me pregunto cuántas veces la siguiente respuesta está vinculada en un día determinado: http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454# 1732454 – Nicole

+0

Analizador de HTML, bla, bla, bla ... Ya conoces el simulacro. –

Respuesta

11

Si MY_TAG no se pueden anidar, pruebe esto para conseguir los partidos:

preg_match_all('/<MY_TAG>(.*?)<\/MY_TAG>/s', $str, $matches) 

Y para eliminarlos, utilice preg_replace lugar.

+0

hii .. ¿qué/s para? gracias por la respuesta – user187580

+0

@ user187580: La bandera * s * hace que los saltos de línea '.' coincidan. Ver http://php.net/manual/en/reference.pcre.pattern.modifiers.php – Gumbo

+0

Será mejor que establezcas ungreedy con este patrón si puedes encontrar esta etiqueta en la cadena más de una vez. De lo contrario, usted encontrará que convertir esta cadena "Este es un muy importante conjunto línea" en "Esta es la línea" – Don

2

Aunque la única manera totalmente correcta de hacerlo es no utilizar expresiones regulares, puede obtener lo que desea si se acepta que no manejará todos los casos especiales:

preg_match("/<em[^>]*?>.*?</em>/i", $str, $match); 
// Use this only if you aren't worried about nested tags. 
// It will handle tags with attributes 

Y

preg_replace(""/<MY_TAG[^>]*?>.*?</MY_TAG>/i", "", $str); 
2

No desea usar expresiones regulares para esto. Una solución mucho mejor sería para cargar sus contenidos en un DOMDocument y trabajar en él utilizando el árbol DOM y métodos DOM estándar:

$document = new DOMDocument(); 
$document->loadXML('<root/>'); 
$document->documentElement->appendChild(
    $document->createFragment($myTextWithTags)); 

$MY_TAGs = $document->getElementsByTagName('MY_TAG'); 
foreach($MY_TAGs as $MY_TAG) 
{ 
    $xmlContent = $document->saveXML($MY_TAG); 
    /* work on $xmlContent here */ 

    /* as a further example: */ 
    $ems = $MY_TAG->getElementsByTagName('em'); 
    foreach($ems as $em) 
    { 
     $emphazisedText = $em->nodeValue; 
     /* do your operations here */ 
    } 
} 
4

Para la eliminación Acabé usando esto:

$str = preg_replace('~<MY_TAG(.*?)</MY_TAG>~Usi', "", $str); 

Uso ~ en lugar de/para el delimitador, se lanzaron errores solucionados debido a la barra invertida en la etiqueta final, lo que parecía ser un problema incluso con el escape. Eliminar> de la etiqueta de apertura permite atributos u otros caracteres y aún así recibe la etiqueta y todos sus contenidos.

Esto solo funciona cuando la anidación no es una preocupación.

Los modificadores Usi significan U = Ungreedy, s = incluyen caracteres linebreak, i = case insensitive.

+0

buen trabajo (y) funciona bien para span e.g $ ptitle = preg_replace ('~ ~ Usi', "", $ ptitleWithSpan); –

Cuestiones relacionadas