Foros del Web » Programando para Internet » PHP »

Backreference en expresiones regulares

Estas en el tema de Backreference en expresiones regulares en el foro de PHP en Foros del Web. Buenos días para todos. Estoy empezando a trabajar con expresiones regulares en php. Tengo una cadena del tipo "Wed, 30 jul 2008 09:00:00 -03:00" y ...
  #1 (permalink)  
Antiguo 30/07/2008, 07:14
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años
Puntos: 9
Backreference en expresiones regulares

Buenos días para todos. Estoy empezando a trabajar con expresiones regulares en php. Tengo una cadena del tipo "Wed, 30 jul 2008 09:00:00 -03:00" y quiero transformarla en "Wed, 30 jul 2008 09:00". Este es mi código:

Código:
$cadena = "Wed, 30 jul 2008 09:00:00 -03:00";
$patron = "-[[:digit:]]{2}\:[[:digit:]]{2}";
$cadena = ereg_replace($patron,"",$cadena);
$patron = "([[:digit:]]{2}\:[[:digit:]]{2})\:[[:digit:]]{2}";
$cadena = ereg_replace($patron,"\1",$cadena);
echo($cadena);

El primer reemplazo (me elimina la hora GMT) funciona correctamente. En el segundo reemplazo agrupo la hora y los minutos, y dejo fuera de este grupo a los segundos. Luego, al ejecutar ereg_replace() quiero que me sustituya la coincidencia por este grupo, pero no encuentro forma de lograrlo. Probe con "1", "$1" y "\1" y no se me ocurre de que otra forma puede ser. Lo único que hace es reemplazarme la coincidencia exactamente por esos valores, y no por el grupo al que quiero hacer referencia. ¿Alguna idea de como hacerlo?. Saludos a todos.
__________________
Add, never Remove
  #2 (permalink)  
Antiguo 30/07/2008, 07:50
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Backreference en expresiones regulares

lo que sucede.... ¿ya has leído alguna referencia de expresiones regulares???

para poder hacer referencia a algo, debes capturarlo.... encerrándolo entre paréntesis....

Código PHP:
preg_match_all('/([0-9]+)*/''Wed, 30 jul 2008 09:00:00 -03:00'$test);

print_r($test); 

PDTA: una repasada a alguna guía, no vendría mal.... suerte!

- por cierto, para lo que quieres... no hacen falta las expresiones, con un simple strtodate() para convertir la primer fecha en un timestamp .... y luego, un date() para darle el formato que deseas... o gmdate() como prefieras....
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 30/07/2008, 09:41
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años
Puntos: 9
Respuesta: Backreference en expresiones regulares

A ver... no quiero faltarte el respeto con lo que te voy a decir, a pesar de que vos si me lo has faltado, de hecho, si he leído referencias acerca de expresiones regulares y de ahí saqué que lo hacian simplemente indicando el índice del grupo que capturamos, sin ningún caracter especial por delante, como sucede en javascript que utilizamos $1. De todas formas, supongo que tienes que saber que he leído algo antes de preguntar en el foro, ya que para machear un dígito estoy utilizando [[:digit:]], cuando en la mayoría de los motores de expresiones regulares que conozco esto se hace con \d. Ahora, te quiero hacer una pregunta: ¿Ya has leído el código que puse?... presta atención a esta parte:

Código:
$cadena = "Wed, 30 jul 2008 09:00:00 -03:00";
$patron = "-[[:digit:]]{2}\:[[:digit:]]{2}";
$cadena = ereg_replace($patron,"",$cadena);
$patron = "([[:digit:]]{2}\:[[:digit:]]{2})\:[[:digit:]]{2}";
$cadena = ereg_replace($patron,"\1",$cadena);
echo($cadena);
__________________
Add, never Remove
  #4 (permalink)  
Antiguo 30/07/2008, 10:01
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Backreference en expresiones regulares

disculpa, ni hablar...

pero si, fue mi error.... ahora, mira...

Código PHP:
<?php

$str
='Wed, 30 jul 2008 09:00:00 -03:00';

echo 
"$str<br/>";
$str preg_replace('/\s*\-?(:?[0-9]+)*$/'''$str);

echo 
"$str<br/>";
$str preg_replace('/:[0-9]+$/'''$str);


echo 
"$str<br/>";

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

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 30/07/2008, 11:20
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años
Puntos: 9
Respuesta: Backreference en expresiones regulares

Gracias pateketrueke. Tu código funciona a la perfección. De todas formas, pude conseguirlo de otra forma con

Código:
$cadena = "Wed, 30 jul 2008 09:00:00 -03:00";
$time = strtotime($cadena);
echo(date("D, d M Y h:m",$time));
Igual, sigo sin poder entender porque no me funciona haciendo referencia hacia atrás al grupo capturado. En todos los tutoriales que leí acerca de expresiones regulares sale que funciona de esa forma. Nuevamente, gracias por tu respuesta. Saludos.

EDITADO
-------------------------------------------------------------------
Luego de postear el último mensaje, probé con preg_replace() y haciendo referencia de la forma $indice_grupo y funciona correctamente.
__________________
Add, never Remove
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 15:13.