Foros del Web » Programando para Internet » PHP »

Excluir tags con expresiones regulares

Estas en el tema de Excluir tags con expresiones regulares en el foro de PHP en Foros del Web. Hola amigos , no me funciona el agregado de elementos a un arreglo......asi de tonto como suena! no le encuentro la falla. A ver si ...
  #1 (permalink)  
Antiguo 14/07/2009, 21:39
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 13 años
Puntos: 292
Exclamación Excluir tags con expresiones regulares

Hola amigos, no me funciona el agregado de elementos a un arreglo......asi de tonto como suena! no le encuentro la falla.

A ver si me dicen donde esta! gracias!!!!!

Código PHP:
<?php
$str 
"Me llamo <i>Italico</i> y quisiera terminar este algoritmo en <b>php</b><p/>";

Function 
no_tags($str){  
  
// pre-condicion: la cadena debe empezar con algo distinto a un tag (<)

  
preg_match_all('@(<[/]?[a-z]{1,}[^>]{0,}[/]?[\w]{0,}?>)@is'$str$matches);
  
$full_tags $matches[0];
   
  
$full_tags array_reverse($full_tags); // tengo que sacar del principio
  
$cant count($full_tags);
 

  
$ini 0
  for (
$i=1;$i<=$cant+1;$i++){
    
$ti array_pop ($full_tags);
  
    
$fin  strpos($str$ti,$ini);  
    if (
$fin==NULL$fin=strlen($str);
    
    
$dif  = ($fin-$ini);
  
   
    
$inserto substr ($str,$ini,$dif);  
    
$no_tag[] = $inserto;       
    
//echo "($ini; $fin) ->$inserto <br/>";  
    
$ini $fin +strlen ($ti);  
  }  

  return (array(
$matches[0],$no_tag));
}  



if ((
strlen($str)>0) and ($str[0]=='<')){
  
$str ' '.$str// parche para saber que comienza con algo distinto de un tag y evitar problemas con el offset (?)
  
$quitar_espacio=TRUE;  
}  

list (
$tag,$notag) = no_tags($str);

$cant count ($notag);
for (
$i=0;$i<$cant;$i++){
  
$a $notag[$i];      //  puedo hacerle lo que quiera....
  
$b $tag[$i];
  
$html $html.$a.$b;  // vuelvo a unir las partes
}
  
//$html = $html.$notag[$i+1];

if ($quitar_espacio){
  
$html =substr ($html,1,strlen($html)-1); // elimino espacio agregado por el tema del offset
}     

echo 
$html;
?>
EDIT: actualizado
__________________
Salu2!

Última edición por Italico76; 15/07/2009 a las 22:02
  #2 (permalink)  
Antiguo 15/07/2009, 10:03
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 12 años
Puntos: 2534
Respuesta: Excluir tags con expresiones regulares

¿que es lo que intentas??

¿capturar tags??


prueba esto:
Código PHP:
<?php

$str 
'Me llamo <i>Ita<var>lic</var>o</i> y <span style="color:red">quisiera terminar</span> este algoritmo en <b>php</b><p/>';

preg_match_all('/<([a-z:-]+)([^>]*)>(.*)<\/\\1>/Uis'$str$match);

var_dump($match);
y ahí tenemos tres cosas...

- el tag
- los atributos
- y el contenido
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 15/07/2009, 10:18
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 13 años
Puntos: 292
Respuesta: Excluir tags con expresiones regulares

PATE... gracias desde ya por tu expresion.... la cual de momento no me funcionó bien.

Lo que intento? es saber PORQUE no se agregan elementos al array... pues me queda vacio ya que la variable $inserto SI tiene contenido, y es la que asigno cada vez a $no_tag

El programa funcionaria.... si me quedara todo en ese array, cosa que no sucede :(
__________________
Salu2!
  #4 (permalink)  
Antiguo 15/07/2009, 10:25
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 12 años
Puntos: 2534
Respuesta: Excluir tags con expresiones regulares

y si el exit lo cambias por break

__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 15/07/2009, 10:49
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 13 años
Puntos: 292
De acuerdo

Cita:
Iniciado por pateketrueke Ver Mensaje
y si el exit lo cambias por break

Algun dia vas a tener que darme la direccion para que te haga un monumento en la plaza mas cercana

GRACIAS!!!!!!!

Bueno.. ahora funca el 90% de las veces...... pero tengo una cadena que no logra filtrar la expresion regular

Necestio parsear bien todos los tags ya que esa es la escencia del programa.
__________________
Salu2!

Última edición por GatorV; 15/07/2009 a las 14:13
  #6 (permalink)  
Antiguo 15/07/2009, 12:24
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 10 años, 10 meses
Puntos: 1517
Respuesta: Excluir tags con expresiones regulares

El preg_match puede ser mas corto

preg_match_all('@<[^>]*>@i', $str, $matches);

Hace exactamente lo mismo que tu haces. Otra cosa si lo que quieres es quitar los tag porque no usas mejor

strip_tags()

El codigo final quedaria asi

Código PHP:
$str 'Me llamo <i>Italico</i> y quisiera terminar este algoritmo en <b>php</b><p/><a    href="http://www.mundo.es"  title="cualquier fruta" rel=\'nofollow\'    >Pepes world</a><img src="lalala"/> <a href="www.google.com">Google</a> ja <img src="casa.jpg" />'

//Imprime      Me llamo Italico y quisiera terminar este algoritmo en phpPepes world Google ja 
echo strip_tag($str); 
  #7 (permalink)  
Antiguo 15/07/2009, 12:29
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 13 años
Puntos: 292
Respuesta: Excluir tags con expresiones regulares

abi, gracias pero tu expresion tambien deja tags en la matriz como puedes comprobar corriendo el script

Cita:
Otra cosa si lo que quieres es quitar los tag porque no usas mejor strip_tags()
Porque quiero EVITAR los tags pero NO removerlos... ya que quiero realizar reemplazos sobre el contenido textual sin tocar los tags de html

Para esto mi estrategia es generar un array con pedazos de texto puro que envio a funciones de reemplazo y luego vuelvo a embeber con los tags y finalmente concateno con implode()
__________________
Salu2!
  #8 (permalink)  
Antiguo 15/07/2009, 12:34
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 10 años, 10 meses
Puntos: 1517
Respuesta: Excluir tags con expresiones regulares

Cita:
Iniciado por Italico76 Ver Mensaje
abi, gracias pero tu expresion tambien deja tags en la matriz como puedes comprobar corriendo el script
Por eso dije que era lo mismo que tu haces

Estoy viendo como hacer para que lea los ultimos dos

Última edición por abimaelrc; 15/07/2009 a las 12:39
  #9 (permalink)  
Antiguo 15/07/2009, 12:48
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 13 años
Puntos: 292
Respuesta: Excluir tags con expresiones regulares

ABI... tu expresion me sirvió... al final pude mirando encontrar algo parecido:

preg_match_all('@(<[a-z]{1,}[^>]{0,}[/]?>)@is', $str, $matches);

parece que si.......

EDIT: pero no
__________________
Salu2!

Última edición por Italico76; 15/07/2009 a las 13:10
  #10 (permalink)  
Antiguo 15/07/2009, 13:06
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 10 años, 10 meses
Puntos: 1517
Respuesta: Excluir tags con expresiones regulares

¿Y el monumento mio?

No es necesario [/]? en la expresion. Te sugiero escribirla asi

preg_match_all('@(<[a-z]{1,}[^>]*>)@i', $str, $matches);
  #11 (permalink)  
Antiguo 15/07/2009, 13:09
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 13 años
Puntos: 292
Respuesta: Excluir tags con expresiones regulares

ABI.....espera un poco para el monumento que seguí probando y encontré fallas.... // por ejemplo,.. no estaba chequeando las barras de cierre adelante o atras en el tag.

Hasta ahora llegué a...

preg_match_all('@(<[/]?[\w]{0,}[a-z]{1,}[^>]{0,}[/]?>)@is', $str, $matches);

pero no funciona del todo
__________________
Salu2!
  #12 (permalink)  
Antiguo 15/07/2009, 13:11
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 10 años, 10 meses
Puntos: 1517
Respuesta: Excluir tags con expresiones regulares

Se me fastidio el monumento jajaja
  #13 (permalink)  
Antiguo 15/07/2009, 13:12
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 13 años
Puntos: 292
Respuesta: Excluir tags con expresiones regulares

Ayuden... si pueden... [ GRACIAS ]

Sus nombres irán en los creditos de la clase que voy a hacer
__________________
Salu2!
  #14 (permalink)  
Antiguo 15/07/2009, 13:14
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 10 años, 10 meses
Puntos: 1517
Respuesta: Excluir tags con expresiones regulares

Estoy en eso, dame un break que estoy haciendo pruebas, pero vas a tener que ir a Puerto Rico para hacerme el monumento
  #15 (permalink)  
Antiguo 15/07/2009, 13:44
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 13 años
Puntos: 292
Respuesta: Excluir tags con expresiones regulares

Lo que me sorprende es que no funcione ya que los tags enteros quedan en la matriz:

Array
(
[0] => <i>
[1] => </i>
[2] => <b>
[3] => </b>
[4] => <p/>
[5] => <a href="http://www.mundo.es" title="cualquier fruta" rel='nofollow' >
[6] => </a>
[7] => <img src="lalala"/>
[8] => <a href="www.google.com">
[9] => </a>
[10] => <img src="casa.jpg" />
)
__________________
Salu2!
  #16 (permalink)  
Antiguo 15/07/2009, 14:18
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 13 años, 10 meses
Puntos: 2135
Respuesta: Excluir tags con expresiones regulares

Un 'error' que veo en tu algoritmo es que te va a fallar si hay dos tags iguales, a lo mejor es por eso que no te sirve, para remediarlo especificale el 3er parámetro a offset para que strpos sepa donde buscar en las siguientes vueltas de tu ciclo.

Saludos.
  #17 (permalink)  
Antiguo 15/07/2009, 14:26
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 13 años
Puntos: 292
De acuerdo Respuesta: Excluir tags con expresiones regulares

Cita:
Iniciado por GatorV Ver Mensaje
Un 'error' que veo en tu algoritmo es que te va a fallar si hay dos tags iguales, a lo mejor es por eso que no te sirve, para remediarlo especificale el 3er parámetro a offset para que strpos sepa donde buscar en las siguientes vueltas de tu ciclo.

Saludos.
Amigo: iba a hacer eso y se me olvidó!

menos mal que te has tomado el trabajo de mirar mi codigo.....te agradezco en el alma.

Ya lo cambié y parece funcionar (por ahora)

Código PHP:
$fin  strpos($str$ti,$ini); 
Al menos esta mejor
__________________
Salu2!
  #18 (permalink)  
Antiguo 15/07/2009, 14:32
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 10 años, 10 meses
Puntos: 1517
Respuesta: Excluir tags con expresiones regulares

Se fue el monumento para mexico de nuevo jajaja.

Bueno lo unico que te sugiero es que uses la expresion asi

Código PHP:
preg_match_all('@<[^>]*>@i'$str$matches); 
  #19 (permalink)  
Antiguo 15/07/2009, 14:33
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 13 años
Puntos: 292
Bien.... "puede" que este bien ahora....aca el codigo:

Código PHP:
<?php
$str 
'Me<b></b> llamo <i>Italico</i> y quisiera terminar este algoritmo en <b>php</b><p/><a    href="http://www.mundo.es"  title="cualquier fruta" rel=\'nofollow\'    >Pepes world</a><img src="lalala"/> <a href="www.google.com">Google</a> ja <iMg   SRC="casa.jpg" />la la la' ;

Function 
no_tags($str){  
  
// pre-condicion: la cadena debe empezar con algo distinto a un tag (<)

  
preg_match_all('@(<[/]?[a-z]{1,}[^>]{0,}[/]?[\w]{0,}?>)@is'$str$matches);
  
$full_tags $matches[0];
   
  
$full_tags array_reverse($full_tags); // tengo que sacar del principio
  
$cant count($full_tags);
 

  
$ini 0
  for (
$i=1;$i<=$cant+1;$i++){
    
$ti array_pop ($full_tags);
  
    
$fin  strpos($str$ti,$ini);  
    if (
$fin==NULL$fin=strlen($str);
    
    
$dif  = ($fin-$ini);
  
   
    
$inserto substr ($str,$ini,$dif);  
    
$no_tag[] = $inserto;       
    
//echo "($ini; $fin) ->$inserto <br/>";  
    
$ini $fin +strlen ($ti);  
  }  

  return (array(
$matches[0],$no_tag));
}  



if ((
strlen($str)>0) and ($str[0]=='<')){
  
$str ' '.$str// parche para saber que comienza con algo distinto de un tag y evitar problemas con el offset (?)
  
$quitar_espacio=TRUE;  
}  

list (
$tag,$notag) = no_tags($str);

$cant count ($notag);
for (
$i=0;$i<$cant;$i++){
  
$a $notag[$i];      //  puedo hacerle lo que quiera....
  
$b $tag[$i];
  
$html $html.$a.$b;  // vuelvo a unir las partes
}
  
//$html = $html.$notag[$i+1];

if ($quitar_espacio){
  
$html =substr ($html,1,strlen($html)-1); // elimino espacio agregado por el tema del offset
}     

echo 
$html;  
?>

Cita:
Iniciado por abimaelrc Ver Mensaje
Se fue el monumento para mexico de nuevo jajaja.

Bueno lo unico que te sugiero es que uses la expresion asi

Código PHP:
preg_match_all('@<[^>]*>@i'$str$matches); 
Gracias ABI! si... a GatorV no se le escapa nada pero valoro mucho lo que has hecho

Voy a probar todo.....

GRACIAS A TODOS MIS AMIGOS
__________________
Salu2!

Última edición por Italico76; 15/07/2009 a las 21:59
  #20 (permalink)  
Antiguo 15/07/2009, 14:37
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 10 años, 10 meses
Puntos: 1517
Respuesta: Excluir tags con expresiones regulares

En la expresion tienes demas muchos codigos, acuerdate que lo que hace [^>] es decir verifica todo lo que no sea >, por lo tanto

[/]?[a-z]{1,} //esta demas
{0,}[/]?[\w]{0,}? //esta demas

Edito:
Te me adelantaste a lo que te estaba escribiendo
  #21 (permalink)  
Antiguo 15/07/2009, 18:17
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 13 años
Puntos: 292
Respuesta: Excluir tags con expresiones regulares

ABI...tienes razon.... en lo de que he sido redundante! por el momento lo dejo asi pero ya documenté lo que dices ;)

Mil gracias a todos de nuevo.....

Edité el codigo "final" y puse un programita que usa la funcion donde se ve la "utilidad"
__________________
Salu2!
  #22 (permalink)  
Antiguo 15/07/2009, 21:22
 
Fecha de Ingreso: julio-2009
Mensajes: 28
Antigüedad: 10 años, 8 meses
Puntos: 0
Respuesta: Excluir tags con expresiones regulares

Exelente, las expresiones regulares siempre son delicadas y con cualquier errorcito dejan de funcionar, muy buena plática a la que se le puede sacar mucho provecho.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:02.