Foros del Web » Programando para Internet » PHP »

problema con substr() y strrpos()

Estas en el tema de problema con substr() y strrpos() en el foro de PHP en Foros del Web. hola, tengo un problema con este código: Código PHP: // buscar el caracter '{' en una cadena ($_prop_args[3]), de estar se ejecuta el codigo que sigue if ( strrpos ( $_prop_args [ 3 ],  '{'  ) !==  false  ) { // extraer los caracteres que haya entre '{' y '}'    $this -> ...
  #1 (permalink)  
Antiguo 13/04/2003, 11:58
Avatar de sci-fi  
Fecha de Ingreso: marzo-2002
Mensajes: 157
Antigüedad: 15 años, 9 meses
Puntos: 0
problema con substr() y strrpos()

hola,

tengo un problema con este código:

Código PHP:
// buscar el caracter '{' en una cadena ($_prop_args[3]), de estar se ejecuta el codigo que sigue

if (strrpos($_prop_args[3], '{' ) !== false ) {

// extraer los caracteres que haya entre '{' y '}'
  
$this->str_camposCount substr($_prop_args[3],
                                                        (
strrpos($_prop_args[3], '{') + ),
                                                        ( 
strrpos($_prop_args[3], '}') - )
                                              );
}
                            return 
$this->str_camposCount
$_prop_args[3] tiene el valor

'INNER JOIN con_resenias AS r ON {r.fid} = f.id'

lo que quiero es extraer lo que haya entre '{' y '}', o sea en este caso 'r.fid', pero lo que retorna este código es

' r.fid} = f.id ',

cuando debería ser ' r.fid '.

si el condicional arriba (if) da false, el valor de $this->str_camposCount es null (por defecto). no puedo ver el error que haya en este código, o si será solamente un bug bajo windows (lo estoy testeando en windows y me da eso, todavía no lo testeé en *nix)... hay otras circunstancias que por ahí tienen que ver pero no la quiero hacer larga

gracias, y saludos
__________________
webdeveloper
http://www.javascripters.com.ar/
diseño web y tecnología
  #2 (permalink)  
Antiguo 13/04/2003, 12:24
 
Fecha de Ingreso: agosto-2002
Ubicación: Colón - Entre Rios - Argentina
Mensajes: 647
Antigüedad: 15 años, 4 meses
Puntos: 8
Para hacer eso podrias usar expresiones regulares, seria algo así


$cadena = 'INNER JOIN con_resenias AS r ON {r.fid} = f.id' ;
ereg("\{(.*)\}", $cadena, $reg);



Despues de esto tenes el array $reg que contiene $reg[0] = "{r.fid}" y $reg[1] = "r.fid".

Proba hacer despues
Código PHP:
echo nl2br(print_r($reg1)); 
Saludos!
  #3 (permalink)  
Antiguo 13/04/2003, 12:33
 
Fecha de Ingreso: febrero-2003
Mensajes: 9
Antigüedad: 14 años, 10 meses
Puntos: 0
Bueno, los errores mas comunes en este tipo de expresiones son debidos a olvidos de comillas, parentesis, corchetes, etc. El consejo que te puedo dar, y quizas sea equivocado totalmente y en ese caso corregidme, es que en vez de usar expresiones tipo

$variable = funcion ($array["dato"],loquesea);

hagas

$variable = $array["dato"];
$variable2 = funcion($variable,loquesea);

de esta forma es mas largo pero no usas un array dentro de una funcion, que casi siempre acaba en error.

Igual me equivoco, probablemente, asi que corregidme.

Saludos
  #4 (permalink)  
Antiguo 13/04/2003, 15:00
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 5 meses
Puntos: 16
Hola,

Tu problema con substr() es que no has leido atentamente su descripcion en el manual:
Cita:
string substr ( string string, int start [, int length])
Es decir, tiene como parametros el texto, la posicion del primer caracter y el numero de caracteres. En tu codigo le pasas como tercer parametro la posicion del }, que substr() lo interpreta como el numero de caracteres.

Suerte.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #5 (permalink)  
Antiguo 13/04/2003, 20:03
Avatar de sci-fi  
Fecha de Ingreso: marzo-2002
Mensajes: 157
Antigüedad: 15 años, 9 meses
Puntos: 0
es cierto

ok, gracias a todos por la ayuda...

josemi, tenes razón... está mal ese codigo. el tercer argumento es la longitud, no-indexada por cero al contrario del segundo argumento...

bueno, lo que pasa es que no puedo saber de antemano cuánto tendrá de largo lo que haya entre { y }, así que usaré el ejemplo de las regexp que da fran86... creo que sería lo más adecuado... y si no, con funciones de string, o tengo que hacer un malabar con substr() -voy a tener que usar strrpos() de '}' de todas maneras-, o usar otra función. ahora estoy viendo el manual y me parece que va a ser mejor combinar substr() con strstr()


Código PHP:
// buscar el caracter '{' en una cadena 
// ($_prop_args[3]), de estar se ejecuta
// el codigo que sigue

if (strrpos($_prop_args[3], '{' ) !== false ) {

// extraer los caracteres que haya entre '{' y '}'
  
$this->str_camposCount substr
                     
strstr ($_prop_args[3], '{'),
                     
0,
                     
strrpos(
                                 
strstr 
                                         
($_prop_args[3], '{'),
                                 
'}'
                                 
)
                     );
}
                            return 
$this->str_camposCount
no se si sera la mejor solucion, lo acabo de testear y me funciona. pero es horrible para leer...

Código PHP:
strstr($_prop_args[3], '{'), // devuelve '{r.fid} = f.id ' 
Código PHP:
strrpos(
                      
strstr ($_prop_args[3], '{'),
                     
'}'
                      
); // devuelve la longitud hasta el próximo '}',
// sacando la posición de '}',
// que en este caso coincide con la longitud que busco
// ya que se empieza de '{r.fid... etc' esta vez,
// y no desde el principio de toda la cadena anterior... 
// bueno, esto es re-enrevesado, así que me voy con dios... 
// ahora me acuerdo, mañana no voy a tener ni idea 
muchas gracias a todos
__________________
webdeveloper
http://www.javascripters.com.ar/
diseño web y tecnología

Última edición por sci-fi; 13/04/2003 a las 20:07
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 04:11.