Comunidad de diseño web y desarrollo en internet online

Otro más con Expresiones Regulares

Citar            
MensajeEscrito el 16 May 2013 07:02 pm
Necesito vuestra ayuda, pues hay una cosilla que me esta volviendo loco
Tengo una cadena como esta
{duracion funcion=TXT size=10 chk texto="Hola MUNDO"}

Por Chory

23 de clabLevel



 

firefox
Citar            
MensajeEscrito el 16 May 2013 07:14 pm
¿Y el problema es...?

Por SinSemilla

Claber

336 de clabLevel



Genero:Masculino  

i am that i am...

firefox
Citar            
MensajeEscrito el 16 May 2013 08:40 pm
Arghhhh, no se publico entero
El problema es que necesito una expresion regular, que sea capaz de separarme la cadena {duracion funcion=TXT size=10 chk texto="Hola MUNDO"} en un array con estos datos
[0] duracion
[1] funcion=TXT
[2] size=10
[3] chk
[4] texto="Hola MUNDO"}
Estos parámetros pueden ser más o menos, pueden contener un valor, como funcion, size o texto, o ninguno como chk.

Mientras cenaba se me ha ocurrido hacer una unción que recorra la cadena y mediate comparaciones generar el array, pero si se puede con una expresión regular, supongo que será más rápido.

Por Chory

23 de clabLevel



 

firefox
Citar            
MensajeEscrito el 17 May 2013 01:06 am
¿Y si en vez de crear esa cadena sin sentido usas una estructura JSON?

Seria algo como:

Código :

{
"un_string":"cadena de string",
"un_array":[1,2,3,4,5],
"un_objeto":{
        "algo":"valor",
        "otro_algo":"otro_valor"
    }
}


Y con

Código PHP :

$mi_json = json_decode($el_string_json);

Lo convertis en un objeto, y si le pasas como segundo parámetro true, te devuelve un array.

Y para usarlo haces

Código PHP :

$algo = $mi_json->propiedad;

O

Código PHP :

$algo = $mi_json['propiedad'];


Saludos!

Por SinSemilla

Claber

336 de clabLevel



Genero:Masculino  

i am that i am...

firefox
Citar            
MensajeEscrito el 17 May 2013 10:42 am
jaja, el sentido de esta cadena, es que la uso para la generación de plantillas, y quería hacerlo lo más "fácil" posible.
{duracion funcion=TXT size=10 chk texto="Hola MUNDO"}
duración es el campo con el que se va a trabajar y la función específica para trabajar ese campo
función es opcional, si se especifica indica que función hay que usar en lugar de la por defecto para ese campo ( duracion ), en este caso llamaría a la función TXT
size tambien es por opcional
chk tambien es por opcional, en este caso indicaría que el campo duración ha de ser checkbox
texto tambien es por opcional. En este caso solo lo he puesto para el tema de las comillas

La idea es poder hacer las definiciones, como si de un lenguaje de programación se tratase, solo que entre llaves, es para añadirlo a Plantillas

Por Chory

23 de clabLevel



 

firefox
Citar            
MensajeEscrito el 17 May 2013 11:13 am
Lo he resuelto con esta función

Código PHP :

function def( $defi )
   {
      $defi=explode(" ",$defi,2);
      $parametros=$defi[1];
      $valores[]=$defi[0];
      $com=false;
      for($car=0;$car<strlen($parametros);$car++)
      {
         $a.=$parametros[$car];
         if ($parametros[$car] == '"' ) $com= !$com;
         if ( $parametros[$car] == " " && !$com) 
         {            
            $valores[]=trim($a);
            $a="";            
         }
      }
      $valores[]=$a;
      return $valores;
}

Por Chory

23 de clabLevel



 

firefox
Citar            
MensajeEscrito el 17 May 2013 12:42 pm
Sigo pensando que es mejor usar JSON...

Con esa función veo 2 problemas.

Te falta definir $a antes del FOR (da un WARNING).

El resultado de esa función es un array con:

{duracion
funcion=TXT
size=10
chk
texto="Hola MUNDO"}

Y me imagino que tenés que parsear cada uno de esos strings para saber que son...

Gustos son gustos, pero a mi me parece mas fácil y cómodo trabajar con un objeto.

Saludos!

Por SinSemilla

Claber

336 de clabLevel



Genero:Masculino  

i am that i am...

firefox
Citar            
MensajeEscrito el 17 May 2013 12:50 pm
Chory:
Coincido con SinSemilla. JSON le calza como anillo al dedo al problema que has planteado.

Lo que quieres hacer en JSON sería así:

Código :

{
"duracion":null,
"funcion":"TXT",
"size":10,
"chk":null,
"texto":"Hola MUNDO"
}

Y con la función json_decode() puedes transformar ese texto en un array o en un objeto PHP sin más.

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 17 May 2013 04:18 pm
Un ejemplo simplificado de como funcionaria todo esto

Código PHP :

<?php
$valoresIdiomas = array ( 1 );
$cadena='{idioma funcion=BANDERAS max=5 txt="Idioma"}';
$parametros= def( $cadena );
echo BANDERAS( $valoresIdiomas, $parametros );
$cadena='{idiomas funcion=BANDERAS multi max=3 txt="Idiomas"}';
print_r("<br>");
$valoresIdiomas = array ( 0,2 );
$parametros= def( $cadena );
echo BANDERAS( $valoresIdiomas, $parametros );

function def( $defi )
   {
// Aquí empieza el código, que me gusratía poder sustituir por una expresión regular
      $var="";
      $defi=str_replace(array("{","}"),"",$defi);
      $defi=explode(" ",$defi,2);
      $parametros=$defi[1];
      $valores[]=$defi[0];
      $com=false;
      for($car=0;$car<strlen($parametros);$car++)
      {
         $a.=$parametros[$car];
         if ($parametros[$car] == '"' ) $com= !$com;
         if ( $parametros[$car] == " " && !$com) 
         {            
            $valores[]=trim($a);
            $a="";            
         }
      }
      $valores[]=$a;
// Aqui acaba         
      $parametros=NULL;
      if (count($valores)!=1)
      {
         for($contador=1;$contador<count($valores);$contador++)
         {
            $p=explode("=",$valores[$contador]);
            if( $p[1]=="" ) $p[1]="si";
            $parametros[ $p[0] ]=$p[1];
         }
      }
      else
      {
       $parametros="";
      }
      $parametros["campo"]=$valores[0];
      return $parametros;
   }

function BANDERAS( $valores, $parametros )
{
   $idiomas=array (
      array ("valor"=>0,"idioma"=>"Español" ),
      array ("valor"=>1,"idioma"=>"Francés" ),
      array ("valor"=>2,"idioma"=>"Inglés" ),
      array ("valor"=>3,"idioma"=>"Italiano" ),
      array ("valor"=>4,"idioma"=>"Portugués" )
      );
   extract($parametros);
   $modo=( $multi || $check ) ? "checkbox":"radio";
   $multi=( $multi || $check ) ? "[]":"";
   $html=str_replace('"',"",$txt).": ";
   $contador=0;
   foreach($idiomas as $idioma)
   {
      $contador++;
      $sel= ( in_array($idioma['valor'], $valores ) ) ? ' checked="checked" ':'';
      $html.='<input type="'.$modo.'" name="'.$campo.$multi.'" value="'.$idioma['valor'].'" '.$sel.'/>'.$idioma['idioma'];
      if ( $max && ($contador==$max) ) { break; }
   }

   return $html;
}
?>

Las diferencias con el código final son que,
1º "cadena" es extraida mediante una expresión, de un archivo de texto, don de se define la plantilla
2º que mediante comparaciones creo en tiempo de ejecución la función "idioma","idiomas" o "BANDERAS" y cargo un archivo con el mismo nombre, y que contiene el código correspondiente para la función.

Comentaste que en el código anterior, daba un error por no haber definido $a, a mi no me lo dió, por lo que creo que no tengo configurado bien cual ¿ el PHP o el Apache ( uso WAMPSERVER )?

Gracias, por tu tiempo.

Por Chory

23 de clabLevel



 

firefox
Citar            
MensajeEscrito el 17 May 2013 05:26 pm
En el php.ini, la parte de error reporting.

Saludos!

Por SinSemilla

Claber

336 de clabLevel



Genero:Masculino  

i am that i am...

firefox
Citar            
MensajeEscrito el 17 May 2013 06:54 pm
Joer, annnnda que no me dio errores por no definir las variables, ¿ pero eso es tan importante?
Ahora si en un formulario uso por ejemplo
$_REQUEST['variable']
y esa variable no ha sido pasada me da error.
en php.ini he definido esto ~E_ALL | ~E_NOTICE | ~E_STRICT

Por Chory

23 de clabLevel



 

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.