PHP: eliminar tags y su contenido de un string

minipelos

Güenas!

Al lío. Tengo un string con un contenido en html. A partir de ciertas condiciones, tengo que quitar el tag y el contenido de cierto tag inventado para la ocasión...

ejemplo:

TENGO ESTO:


Este texto tiene que estar<quitar> y este no</quitar>.

Y ahora probamos de nuevo y <quitar>no </quitar>ha quitado el texto correctamente.

En los tags <quitar>, quiero quitar, tanto el tag como el contenido que hay entre apertura y cierre, dejando el texto así:
QUIERO ESTO:


Este texto tiene que estar.

Y ahora probamos de nuevo y ha quitado el texto correctamente.

Había hecho algo así pero me elimina desde la primera apertura hasta el último cierre
HICE ESTO:


$texto = "Este texto tiene que estar<quitar> y este no</quitar>.

Y ahora probamos de nuevo y <quitar>no </quitar>ha quitado el texto correctamente.";

$textofiltrado = eregi_replace("<quitar>(.*)</quitar>"," ",$texto);

echo $textofiltrado;

PERO ME DA ESTO:


Este texto tiene que estar ha quitado el texto correctamente.

no estoy muy documentado en expresiones regulares, dicho sea y está siendo un poco suplicio dar con la solución. ¿alguien me echa un cable?

thx!!!

(rpv en las mayúsculas JELP!)

Edit: respuesta en #5 por si alguien mas lo quiere

funcion quitartag(texto,tag_a_quitar)
Dod-Evers

Te lo hace porque en la ER te pilla <quitar> y este no</quitar>.

Y ahora probamos de nuevo y <quitar>no </quitar>
como el token entero a quitar.

Ahora mismo no sé qué solución darte, pero no es fácil...

Es decir, te lo hace bien, sólo si hay un <quitar>blabla</quitar>.

minipelos

ya, ese es el problema, me cepilla hasta la última aparición.

al final me he hecho una función un tanto bruta sin regex, pero bueno, funciona siempre y cuando el tag no tenga propiedades (rollo <quitar propiedad=valor> )

<?php
function quitatag($taginicial,$tagfinal,$texto){
	$textofiltrado = $texto;
	while($primera = stripos($textofiltrado,$taginicial)){
		$ultima = stripos($textofiltrado,$tagfinal);
		$textofiltrado = substr($textofiltrado,0,$primera).substr($textofiltrado,$ultima+strlen($tagfinal));
	}
	return $textofiltrado;
}



$texto = "Este texto tiene que estar<quitar> y este no</quitar>.

Y ahora probamos de nuevo y <quitar>no </quitar>ha quitado el texto correctamente.";

$ini = "<quitar>";
$fin = "</quitar>";
echo quitatag($ini,$fin,$texto);

?>

pero sí que me gustaría saber si hay alguna manera algo más correcta de hacerlo, pues es un poco a capón lo que he hecho xD

edit: polloooo!! pon bien el code! que se lee fatal! xD

NeB1

$cadenaSinSimbolos=strip_tags($cadenaConSimbolos);

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

EDIT había leído mal xDD

NeB1
<?php
	$cadena ="Este texto tiene que estar<quitar> y este no </quitar>. Y ahora probamos de nuevo y <quitar>no </quitar>ha quitado el texto correctamente.";
	echo preg_replace("%(<quitar.*?>)(.*?)(<\/quitar.*?>)%is","",$cadena);

?>

de nada ^^

guner

por qué tantos sub-patrones?

JuAn4k4

<quitar> [ cualquier cosa menos </quitar> ni <quitar> ] · </quitar>

si tienes "<quitar> sdfasf <quitar> blabla </quitar> blublu </quitar>" que haces ? ¿ lo quitas todo ? si puedes tener este caso lo que te he dado no va bien, tendras que hacer N pasadas siendo N el numero de veces que se meta uno dentro de otro. (Tambien puedes ir comparando el tamaño de una pasada a otra hasta que sean las 2 ultimas pasadas iguales). Y si no puede darse ese caso, mejor.

En las expresiones regulares que yo daba seria algo asi como

"<quitar>" · [ "<quitar>"| "</quitar>" ] · " </quitar>"

NeB1

#7 es lo que tu dices, por eso el "?" en mi expresión, quiere decir .*? => cualquier cosa menos lo que vá despues del interrogante.

y lo he puesto para que también función <quitar > <quitar > <quitar width=x> etc.

minipelos

NeB1, te debo una ;) me acabas de quitar un dolor de cabeza curioso. Gracias

NeB1

#9 de nada!! ^^

Usuarios habituales

  • NeB1
  • minipelos
  • JuAn4k4
  • guner
  • Dod-Evers