elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
28 Mayo 2012, 13:04  


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales

+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  PHP
| | | |-+  Ayuda con preg_replace() !! (solved)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda con preg_replace() !! (solved)  (Leído 2,589 veces)
Diabliyo


Desconectado Desconectado

Mensajes: 1.270


M.S.I Angel Cantu


Ver Perfil WWW
Ayuda con preg_replace() !! (solved)
« en: 12 Enero 2011, 21:40 »

Buenas.

Quiero utilizar preg_replace() para re-emplazar framento de texto por un fragmento que yo desde, para ello manejo asi las cosas.

El usuario despone de un archivo de texto llamado script.txt, en ese archivo debe realizar una notacion especifica para introducir "comandos", que despues en unos segundos el servidor (utilizando cron y ejecutando un archivo PHP) lo lee y ejecuta las ordenes.

Bueno, dentro de esta notacion quiero que sea posible el usuario pueda imprimir el Nombre del MES (en texto), para ello la notacion seria:

Código:
O,DATE(FECHA:M)

Donde:

, :: (coma) es el delimitador.
O :: lo interpeto como Operacion de Funciones.
DATE() :: es la funcion en PHP.
FECHA :: es el nombre exacto del nombre del campo de una tabla en la base de datos.
M :: seria el argumento que indica el Nombre del Mes en Texto.

Asumiendo esto, lo que estoy hasta ahorita intentando hacer es:

En $m tenemos la trama "O,DATE(FECHA:M)", pero ya convertida en array por explode().
Y $db contiene los campos de la base de datos acorde a la consulta, obtenidos con mysql_fetch_array().
Código
function convierte_comand($m, $db )
{
$box=''; # operador que guarda la suma
for( $i=0; $i<count($m); $i++ )
{
if( $i>0 ) #ignoramos el primer valor
{
  $cad_buscar= array(
  # '/\[capa\=(.*?)\](.*?)\[\/capa\]/is',
  '/DATE\((.*?):(*?)\)/is'
  );
$cad_remplazo= array(
# '<div id="$1">$2</div>',
''. date("'$2'", $db['$1']). ''
               );
 
$box= preg_replace( $cad_buscar, $cad_remplazo, $m[$i] );
}
}
unset($i);
return $box;
}


Como esto lo escribo en una imagen, pues no me escribe informacion alguna :(

Saludos !


« Última modificación: 4 Febrero 2011, 22:50 por Diabliyo » En línea

~ Yoya ~
Wiki

Desconectado Desconectado

Mensajes: 954



Ver Perfil
Re: Ayuda con preg_replace() !!
« Respuesta #1 en: 12 Enero 2011, 22:10 »

Puedes poner uno o dos ejemplos de los datos que recibes y poner como quieres que te queden los datos. En este tipo de problema, siempre es mejor maquetear tu problema.

Ejemplo:
Código
<?php
 
$datos = 'hola mundo';//Datos que recivo| Dato original, sin modificaciones
 
//Reemplazo la palabra mundo por yoya
 
echo preg_replace('/mundo/', 'Yoya', $datos);
 
?>

Así es mas fácil de entender, y no poner de donde puede provenir el valor de la variable $datos. Solo indico la cadena original y como deseo que quede...


En línea

Diabliyo


Desconectado Desconectado

Mensajes: 1.270


M.S.I Angel Cantu


Ver Perfil WWW
Re: Ayuda con preg_replace() !!
« Respuesta #2 en: 12 Enero 2011, 22:19 »

Puedes poner uno o dos ejemplos de los datos que recibes y poner como quieres que te queden los datos. En este tipo de problema, siempre es mejor maquetear tu problema.

Ejemplo:
Código
<?php
 
$datos = 'hola mundo';//Datos que recivo| Dato original, sin modificaciones
 
//Reemplazo la palabra mundo por yoya
 
echo preg_replace('/mundo/', 'Yoya', $datos);
 
?>

Así es mas fácil de entender, y no poner de donde puede provenir el valor de la variable $datos. Solo indico la cadena original y como deseo que quede...

Tu ejemplo le entiendo, por es sencillo y simple, pero en mi caso digamos que estamos asi:

Código
<?php
$buf= mysql_fetch_array($cons);
$datos = 'DATE(FECHA M)'; # ojo DATE() en mayusculas no se interpreta como funcion

//Reemplazo la palabra mundo por yoya
echo preg_replace('/DATE\((.*?) (.*?)\)/is', date("'$2'", $buf['$1']), $datos);
?>

Eso es correcto ?, creo que NO, porque no me imprime la fecha :(
El log error de apache dice:

Código
[Wed Jan 12 15:22:36 2011] [error] [client ::1] PHP Notice:  Undefined index: $1 in /home/diabliyo/public_html/moneybox
/modulos/ioscripts.php on line 276, referer: http://localhost/diabliyo/moneybox/?id=facturas&c=list
 
[Wed Jan 12 15:22:36 2011] [error] [client ::1] PHP Warning:  preg_replace(): Compilation failed: nothing to repeat at offset
13 in /home/diabliyo/public_html/moneybox
/modulos/ioscripts.php on line 280, referer: http://localhost/diabliyo/moneybox/?id=facturas&c=list
 
 

Las lineas del error son aqui:

Código
<?php
272   $cad_buscar= array(
273   '/DATE\((.*?) (*?)\)/is'
274   );
275 $cad_remplazo= array(
276 date( "'$2'", $db['$1'] )
277                );
278
279   $box= htmlentities($box, ENT_QUOTES);
280 $box= preg_replace( $cad_buscar, $cad_remplazo, $box );
?>
« Última modificación: 12 Enero 2011, 22:31 por Diabliyo » En línea

~ Yoya ~
Wiki

Desconectado Desconectado

Mensajes: 954



Ver Perfil
Re: Ayuda con preg_replace() !!
« Respuesta #3 en: 12 Enero 2011, 23:11 »

Código
<?php
 
$box= htmlentities('hola mundo', ENT_QUOTES);
$boxs= preg_replace('/DATE\((.*?) (*?)\)/is', 'hola', $box);
?>

Me sale el mismo error:
Código:
PHP Warning:  preg_replace(): Compilation failed: nothing to repeat at offset
13 in /home/diabliyo/public_html/moneybox
Se debe al segundo paréntesis de captura:
 
Código:
(*?)
Con esto bastaría

Código
<?php
 
$box= htmlentities('hola mundo', ENT_QUOTES);
$boxs= preg_replace('/DATE\((.*?) (.*?)\)/is', 'hola', $box);
?>

Aquí el error:
Código
<?php
272   $cad_buscar= array(
273   '/DATE\((.*?) (*?)\)/is'274   );
275 $cad_remplazo= array(
276 date( "'$2'", $db['$1'] )
277                );
278
279   $box= htmlentities($box, ENT_QUOTES);
280 $box= preg_replace( $cad_buscar, $cad_remplazo, $box );
 

Hazlo asi:
Código
<?php
 
echo preg_replace('/DATE\(([^\)]+)\)$/i', '${1}', 'DATE(FECHA M)');
 
?>
Salida:
Código:
FECHA M
Donde ${1}, contiene el valor del primer paréntesis de captura. Lo que hago es capturar los datos que me interesa para luego ponerlo como el reemplazo, porque todo se borraria.

Código
<?php
 
echo preg_replace('/DATE\(([^\)]+)\)$/i', '', 'DATE(FECHA M)');
 
?>
Si lo dejo así, me borraría todo.

Saludos.
« Última modificación: 12 Enero 2011, 23:12 por ~ Yoya ~ » En línea

Diabliyo


Desconectado Desconectado

Mensajes: 1.270


M.S.I Angel Cantu


Ver Perfil WWW
Re: Ayuda con preg_replace() !!
« Respuesta #4 en: 12 Enero 2011, 23:36 »

Buenas...

He realizado el cambio pero en vez de imprimirme la fecha, me imprime 'M', vaya, las comillas y dentro la letra M (tal cual todo).

Mi codigo:
Código
<?php
$cad_buscar= array(
'/DATE\((.*?) (.*?)\)/is'
);
$cad_remplazo= array(
date("'$2'", $db['$1'])
);
 
$box= htmlentities($box, ENT_QUOTES);
$box= preg_replace( $cad_buscar, $cad_remplazo, $box );
?>

Se supone que debe imprimir la fecha, vaya en este caso como el comando es: DATE(FECHA M), deberia imprimirse: Jan (Enero en ingles), pero se imprime la letra M.

Y el log error de apache dice:
Código
[Wed Jan 12 16:36:58 2011] [error] [client ::1] PHP Notice:  Undefined index: $1 in /home/diabliyo/public_html/moneybox
/modulos/ioscripts.php on line 276, referer: http://localhost/diabliyo/moneybox/?id=facturas&c=list
 

Se supone que $db['$1'] seria como hacer: $db["FECHA"], ya que $db es un array obtenido mediante la funcion mysql_fetch_array();, y como el usuario invoco el comando DATE(FECHA M), el valor de FECHA es el que pongo, pero algo sale mal.

Alguna idea ?
« Última modificación: 12 Enero 2011, 23:41 por Diabliyo » En línea

~ Yoya ~
Wiki

Desconectado Desconectado

Mensajes: 954



Ver Perfil
Re: Ayuda con preg_replace() !!
« Respuesta #5 en: 12 Enero 2011, 23:50 »


Hazlo asi:
Código
<?php
 
echo preg_replace('/DATE\(([^\)]+)\)$/i', '${1}', 'DATE(FECHA M)');
 
?>
Salida:
Código:
FECHA M
Donde ${1}, contiene el valor del primer paréntesis de captura. Lo que hago es capturar los datos que me interesa para luego ponerlo como el reemplazo, porque todo se borraria.

Código
<?php
$cad_buscar= array(
'/DATE\((.*?) (.*?)\)/is'
);
$cad_remplazo= array(
date("'$2'", $db['$1']) );
 
$box= htmlentities($box, ENT_QUOTES);
$box= preg_replace( $cad_buscar, $cad_remplazo, $box );
?>
Debes usar ${2} y no $2, te lo dije mas arriba. Le pasas otro argumento a la función date y nose que dato puede ser, por eso te dije que maquetees.


Código
<?php
$buf= mysql_fetch_array($cons);
$datos = 'DATE(FECHA M)'; # ojo DATE() en mayusculas no se interpreta como funcion

//Reemplazo la palabra mundo por yoya
echo preg_replace('/DATE\((.*?) (.*?)\)/is', date("'$2'", $buf['$1']), $datos);
?>

Pusiste ese código, pero no lo podre usar, porque tendría que hacer una conexión MYSQL y una consulta y nose que otra cosa para poder darle un valor a la variable $buf que no se que tipo de datos pueda contener ni como seria el formato.

Si usas este:
Código
<?php
 
$buf = 'hola mundo';//Datos que recivo| Dato original, sin modificaciones
 
//Reemplazo la palabra mundo por yoya
 
echo preg_replace('/mundo/', 'Yoya', $datos);
 
?>

Tengo todo los datos claro y funcionara.
En línea

Diabliyo


Desconectado Desconectado

Mensajes: 1.270


M.S.I Angel Cantu


Ver Perfil WWW
Re: Ayuda con preg_replace() !!
« Respuesta #6 en: 13 Enero 2011, 00:32 »

Pusiste ese código, pero no lo podre usar, porque tendría que hacer una conexión MYSQL y una consulta y nose que otra cosa para poder darle un valor a la variable $buf que no se que tipo de datos pueda contener ni como seria el formato.

La conexión a la Base de Datos y consulta ya la hice en otra parte del código, a esta función le envío la variable $buf, a la cual ya previamente se le paso la conexion y se le metieron los datos ($buf=mysql_fetch_array($cons)).

Por cierto, modifique el code así:

Código
<?php
$cad_buscar= array(
'/DATE\((.*?) (.*?)\)/is'
);
$cad_remplazo= array(
date("${2}", $db['$1'])
);
 
$box= htmlentities($box, ENT_QUOTES);
$box= preg_replace( $cad_buscar, $cad_remplazo, $box );
?>

Y sigue fallando :(, ahora no imprime nada.... Creo que el problema va por la $1 ?, no ?

El error log mando:
Código
[Wed Jan 12 17:32:28 2011] [error] [client ::1] PHP Notice:  Undefined index: $1 in /home/diabliyo/public_html/moneybox
/modulos/ioscripts.php on line 276, referer: http://localhost/diabliyo/moneybox/?id=facturas&c=list
 

Si pongo date("'${2}'", $db['$1']), me imprime simplemente '' (dos comilla simple)...

Y sinceramente no tengo ni idea de que intentas decir con maquetear :S, vaya, la funcion preg_replace(), la manejo con dos arrays porque no pienso incluir solamente un valor, sino que la idea es tener un conjunto de comandos a disposicion del usuario, en este caso el comando es DATE(FECHA M), donde DATE() es el primer indicado para mi de que quiere imprimir una fecha, FECHA sera el nombre del elemento dentro de la tabla (FECHA VARCHAR(100) not NULL, previamente existente claro), M el primer argumento que recive la funcion en php date( arg1, time() );.

« Última modificación: 13 Enero 2011, 00:40 por Diabliyo » En línea

~ Yoya ~
Wiki

Desconectado Desconectado

Mensajes: 954



Ver Perfil
Re: Ayuda con preg_replace() !!
« Respuesta #7 en: 13 Enero 2011, 00:42 »

Quizas no captures nada... Debes estar seguro de la regexp porque pueda que no funcione correctamente y nose si funciona bien o mal porque nose que datos puede contener la variable $box.

[Wed Jan 12 17:32:28 2011] [error] [client ::1] PHP Notice:  Undefined index: $1 in /home/diabliyo/public_html/moneybox
/modulos/ioscripts.php on line 276, referer: http://localhost/diabliyo/moneybox/?id=facturas&c=list

Se debe a esto:
Código
 date("'${2}'", $db['$1'])
Debería ir así:
Código
 date("'${2}'", $db['${1}'])

Quizas esa sea la solucion, de todo modos pueda que no la sea porque nose que tipo de datos contiene $db.
En línea

Diabliyo


Desconectado Desconectado

Mensajes: 1.270


M.S.I Angel Cantu


Ver Perfil WWW
Re: Ayuda con preg_replace() !!
« Respuesta #8 en: 13 Enero 2011, 00:52 »

Quizas no captures nada... Debes estar seguro de la regexp porque pueda que no funcione correctamente y nose si funciona bien o mal porque nose que datos puede contener la variable $box.

[Wed Jan 12 17:32:28 2011] [error] [client ::1] PHP Notice:  Undefined index: $1 in /home/diabliyo/public_html/moneybox
/modulos/ioscripts.php on line 276, referer: http://localhost/diabliyo/moneybox/?id=facturas&c=list

Se debe a esto:
Código
 date("'${2}'", $db['$1'])
Debería ir así:
Código
 date("'${2}'", $db['${1}'])

Quizas esa sea la solucion, de todo modos pueda que no la sea porque nose que tipo de datos contiene $db.

He probado ambas y no imprimde datos :(...

date("'$2'", $db['$1']) --> Imprime: 'M'
date("'${2}'", $db['$1']) --> Imprime: ''
date("'$2'", $db['${1}']) --> Imprime: 'M'
date("'${2}'", $db['${1}']) --> Imprime: ''

La variable $box contiene DATE(FECHA M) unicamente..

De echo invoco echo $'['. $box. ']';  para verificar y estar serciorado que se le esta pasando el comando, y si, me imprme DATE(FECHA M). Despues cuando sale de la funcion, vuelvo a hacerle echo '['. $box. ']'; y ahora imprme el parentesis cuadrado sin informacion :(.

Tienes MSN o Skype si tienes tiempo y puedes, hablamos, sino, seguimos por este medio.

Saludos !
« Última modificación: 13 Enero 2011, 00:56 por Diabliyo » En línea

~ Yoya ~
Wiki

Desconectado Desconectado

Mensajes: 954



Ver Perfil
Re: Ayuda con preg_replace() !!
« Respuesta #9 en: 13 Enero 2011, 00:55 »

Te espero en el IRC de elhacker, si lo solucionas ps pones la solucion en el post...

Mañana hablamos xD, estaré en el IRC al rededor de las 11, hora del foro y de españa.
« Última modificación: 13 Enero 2011, 01:02 por ~ Yoya ~ » En línea

Diabliyo


Desconectado Desconectado

Mensajes: 1.270


M.S.I Angel Cantu


Ver Perfil WWW
Re: Ayuda con preg_replace() !!
« Respuesta #10 en: 14 Enero 2011, 18:05 »

El problema aun continua, no logro dar con el clavo para poder usar bien preg_replace() y funcione sustituyendo DATE(FECHA M) por date( "M", $db["FECHA"]).

Saludos !
En línea

~ Yoya ~
Wiki

Desconectado Desconectado

Mensajes: 954



Ver Perfil
Re: Ayuda con preg_replace() !!
« Respuesta #11 en: 14 Enero 2011, 21:15 »

no puedes usar preg_replace, simplemente devolverá M y no se ejecuta la función date...

Código
<?php
echo preg_replace('/^DATE\(([^\s]+)\s([^\)]+)\)$/',"date($2);", 'DATE(FECHA M)');
?>
Salida:
Código:
M

Lo mejor seria ocupar preg_match y funciona...
Código
<?php
 
$string = 'DATE(FECHA M)';
preg_match('/^DATE\(([^\s]+)\s([^\)]+)\)$/', $string, $result);
echo date($result[2], $db[$result[1]]);
?>

Saludos.
En línea

Diabliyo


Desconectado Desconectado

Mensajes: 1.270


M.S.I Angel Cantu


Ver Perfil WWW
Re: Ayuda con preg_replace() !!
« Respuesta #12 en: 4 Febrero 2011, 17:58 »

no puedes usar preg_replace, simplemente devolverá M y no se ejecuta la función date...

Código
<?php
echo preg_replace('/^DATE\(([^\s]+)\s([^\)]+)\)$/',"date($2);", 'DATE(FECHA M)');
?>
Salida:
Código:
M

Lo mejor seria ocupar preg_match y funciona...
Código
<?php
 
$string = 'DATE(FECHA M)';
preg_match('/^DATE\(([^\s]+)\s([^\)]+)\)$/', $string, $result);
echo date($result[2], $db[$result[1]]);
?>

Saludos.

Retomando esto...

Se podria automatizar el proceso ??... Digo, porque en tu ejemplo en la primer linea esta el $string que contiene el "comando" ( DATE(FECHA M)), en la segunda linea el preg_match que es el que realiza la obtencion de los valores que esta dentro de DATE(). Finalmente en la tercer linea ejecuta la funcion date() con los valores que se guardaron en una variable en array.

Y lo que quisiera es tener una automacion, ya que no siempre sera date podra invocarse otra funcion y el codigo seria mas largo, ta que tendria que hacer algo como if (strstr( $comando, "DATE(" ) ) (comprobar el dato) para asumir si hare date() u otra funcion.

Anteriormente estabamos probando (sin exito porque usabamos preg_replace) con este codigo:

Código
<?php
$box= get_script_clearjump($m[$i]);
$cad_buscar= array(
'/DATE\((.*?) (.*?)\)/is'
);
 
$cad_remplazo= array(
date("'${2}'", $db['${1}'])
);
 
$box= htmlentities($box, ENT_QUOTES);
$box= preg_replace( $cad_buscar, $cad_remplazo, $box );
# $box= preg_match( $cad_buscar, $cad_remplazo, $box );
?>

Como vez tengo dos arreglos, el de la busqueda ($cad_buscar) y el del resultado ($cad_remplazo), se podria manejar igual con preg_match() ? o existe alguna opcion ?

Saludos !
« Última modificación: 4 Febrero 2011, 18:00 por Diabliyo » En línea

~ Yoya ~
Wiki

Desconectado Desconectado

Mensajes: 954



Ver Perfil
Re: Ayuda con preg_replace() !!
« Respuesta #13 en: 4 Febrero 2011, 21:11 »

Me imagino que quieres tratar de optimizar. Aunque todo se resume en una linea:
Código
preg_match('/^DATE\(([^\s]+)\s([^\)]+)\)$/', $string, $result);

O eso fue lo que entendi...


En el tema de los Array solo se podría implementar un solo arreglo que seria el de la busqueda ($cad_buscar).
Código
<?php
 
$string = 'DATE(FECHA M)';
$cad_buscar = array('/^DATE\(([^\s]+)\s([^\)]+)\)$/');
 
preg_match($cad_buscar[0], $string, $result);
echo date($result[2], $db[$result[1]]);
 
?>
En línea

Diabliyo


Desconectado Desconectado

Mensajes: 1.270


M.S.I Angel Cantu


Ver Perfil WWW
Re: Ayuda con preg_replace() !!
« Respuesta #14 en: 4 Febrero 2011, 22:23 »

Me imagino que quieres tratar de optimizar. Aunque todo se resume en una linea:
Código
preg_match('/^DATE\(([^\s]+)\s([^\)]+)\)$/', $string, $result);

O eso fue lo que entendi...


En el tema de los Array solo se podría implementar un solo arreglo que seria el de la busqueda ($cad_buscar).
Código
<?php
 
$string = 'DATE(FECHA M)';
$cad_buscar = array('/^DATE\(([^\s]+)\s([^\)]+)\)$/');
 
preg_match($cad_buscar[0], $string, $result);
echo date($result[2], $db[$result[1]]);
 
?>

Pero el array debe contener un solo valor no ?, si fuese asi, entonces seria mas trabajo, porque ahorita el comando con el que hemos estado lidiando es DATE(FECHA M), pero despues podria ser que el comando fuese: URL(DATO) en donde, lo que se haria es: extraer el Dato, pasarle el htmlentities o el url_encode...

Mi idea anterior (cuando usaba preg_replace()), era la universalidad del codigo, en donde en el arreglo busqeda ponia todas las asignaciones y en el arreglo remplazo lo que queria que se hiciera... Pero claro, necesitamos preg_match() para lograr el objetivo y a como leo en el manual de php, preg_match() en su primer y segundo argumento requieren un string y no un string array.

Que podriamos hacer ?



Ahora DATE(FECHA M) ya se soluciono con tu propuesta, pero quiero que el mismo code pueda funcionar con otros comandos de forma mas simple, sin tener que implementar un if(strstr($dato, "DATE(") ) para cada tipo (DATE(), URL(), etc...)....

El code quedo asi:

Código
<?php
function comando($cmd, $db)
{
$box= get_script_clearjump($cmd); # eliminamos salto de linea '\n'
#$cad_buscar= array(
  # '/DATE\((.*?) (.*?)\)/is'  
  # );
#$cad_remplazo= array(
# date("$y[2]", $db['$y[s1]'])
#        );
   
$box= htmlentities($box, ENT_QUOTES);
$box= preg_match( '/DATE\((.*?) (.*?)\)/is', $box, $y );
# $box= preg_replace( $cad_buscar, $cad_remplazo, $box );
$r= ucfirst( spanish_daymonth( date($y[2], $db[$y[1]]) ) ); # traducimos a castellano la palabra
return $r;
}
?>
« Última modificación: 4 Febrero 2011, 22:30 por Diabliyo » En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema con preg_replace
PHP
PhenfiX 14 1,459 Último mensaje 13 Abril 2008, 21:57
por PhenfiX
Calcular timestamps - solved
Desarrollo Web
l337* 6 980 Último mensaje 9 Febrero 2009, 20:52
por l337*
Ayuda con Preg_Replace
PHP
Ch3ck 3 1,601 Último mensaje 4 Noviembre 2010, 01:10
por Shell Root
[SOLVED: ] Problema .xinitrc
GNU/Linux
n3w 0 1,189 Último mensaje 30 Diciembre 2010, 20:32
por n3w
Es apache, yo o mi proveedor ? (solved) « 1 2 »
PHP
Diabliyo 15 1,985 Último mensaje 3 Febrero 2011, 00:06
por Diabliyo
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines