PHP - Duda con expresión regular para eliminar enlaces

   
Vista:

Duda con expresión regular para eliminar enlaces

Publicado por Javier Alonso (4 intervenciones) el 11/10/2013 18:10:38
Muy buenas
Tengo una duda con una expresión regular para eliminar enlaces que espero me ayuden a resolver.
Pongo un ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
//tengo esta cadena
$cadena='<div><span><a href="#"><div><span>Enlace1</span></div></a><div>y dos</div><a href="#"><div><span>Enlace2</span></div></a><div>Fin</div></span></div>';
//esta expresión regular no funciona y devuelve la misma cadena
$cadena=preg_replace("~<a href=\"#\"[^</a>]*</a>~si","",$cadena);
echo$cadena."<hr />\n";
//si cambio </a> por un caracter cualquiera, por ejemplo @:
$cadena=str_replace("</a>","@",$cadena);
//si que funciona:
$cadena=preg_replace("~<a href=\"#\"[^@]*@~si","",$cadena);
//y restituyo los </a>
$cadena=str_replace("@","</a>",$cadena);
echo$cadena."<hr />";

¿Cómo podría hacer para que la primera funcione?

Gracias de antemano
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve

Duda con expresión regular para eliminar enlaces

Publicado por xve (5519 intervenciones) el 12/10/2013 09:45:38
Hola Javier, he visto tu código y creo que lo tienes mal... prueba este código:
1
2
3
4
5
6
7
<?php
//tengo esta cadena
$cadena='<div><span><a href="#"><div><span>Enlace1</span></div></a><div>y dos</div><a href="#"><div><span>Enlace2</span></div></a><div>Fin</div></span></div>';
//esta expresión regular no funciona y devuelve la misma cadena
$cadena=preg_replace("/<a href=\"#\">(.*)<\/a>/i","",$cadena);
echo $cadena."<hr />\n";
?>

Coméntanos, ok?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Duda con expresión regular para eliminar enlaces

Publicado por Javier Alonso (4 intervenciones) el 12/10/2013 11:10:11
Gracias xve
Lo que ocurre es que así también elimina el "<div>y dos</div>" y lo que yo quiero es que se mantenga.
¿Se te ocurre algún arreglo?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Duda con expresión regular para eliminar enlaces

Publicado por Mari Carmen (145 intervenciones) el 13/10/2013 17:01:28
¿Pero qué quieres hacer? Pon el HTML de ejemplo y como quieres que quede... nos haríamos una idea de como puede ser la expresión regular.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Duda con expresión regular para eliminar enlaces

Publicado por Javier Alonso (4 intervenciones) el 13/10/2013 21:07:13
Gracias Mari Carmen
Lo que quiero es eliminar los enlaces pero mantener el resto de código.
En el ejemplo que ponía al principio (le añado ids para mayor claridad):

<div id="id1"><span id="span1"><a href="#"><div id="div2"><span id="span2">Enlace1</span></div></a><div id="id3">y dos</div><a href="#"><div id="div4"><span>Enlace2</span></div></a><div id="div5">Fin</div></span></div>

querría que quedase:
<div id="id1"><span id="span1"><div id="id3">y dos</div><div id="div5">Fin</div></span></div>

Saludos!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Duda con expresión regular para eliminar enlaces

Publicado por Mari Carmen (145 intervenciones) el 14/10/2013 01:45:22
No soy muy dada a las expresiones regulares, lo siento. Pero puedes probar a usar DOM como método para eliminar los enlaces.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//Creamos el documento
$doc = new DOMDocument;
//Cargamos nuestro código HTML
$doc->loadHTML('<div id="id1"><span id="span1"><a href="#"><div id="div2"><span id="span2">Enlace1</span></div></a><div id="id3">y dos</div><a href="#"><div id="div4"><span>Enlace2</span></div></a><div id="div5">Fin</div></span></div>');
//Seleccionamos todos los elementos a
$as=$doc->getElementsByTagName('a');
//Este foreach se usa por que se comporta de forma extraña
//al hacerlo sobre la lista de objetos.
foreach ($as as $a)
    $nodelist[]=$a;
//Pasamos por los elementos y los eliminamos del DOM
foreach($nodelist as $a)
    $a->parentNode->removeChild($a);
//Nos muestra el resto por pantalla. (incluye el doctype y si no has agregado
//las etiquetas html y body también te las agrega.
echo $doc->saveHTML();

Espero que te sirva.
Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Duda con expresión regular para eliminar enlaces

Publicado por Javier Alonso (4 intervenciones) el 14/10/2013 08:20:38
Muchas gracias Mari Carmen
La verdad es que te lo "has currado" y es una gran alternativa que tendré en cuenta.
Un saludo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar