Ver Mensaje Individual
  #4 (permalink)  
Antiguo 17/12/2006, 18:20
califa010
 
Fecha de Ingreso: enero-2006
Ubicación: Buenos Aires, Argentina
Mensajes: 299
Antigüedad: 18 años, 3 meses
Puntos: 5
Re: Argument count

Buenas, se me ocurre hacerlo así, con un loop "a mano":

Código PHP:
<?php

function parse_args($str_args) {

    
$arr_args = array();
    
$flg_comillas false/* cuando encuentra una comilla inicial, vale true; caso contrario, false */
    
$substr_init 0/* guarda la posición inicial de cada substring */
    
    
$len strlen($str_args);
    
/* recorre todo el string */ 
    
for ($i=0;$i<$len;$i++) {
        
        
/* si encuentra comillas, invierte el flag  */
        
if($str_args{$i} == '"') {
            
$flg_comillas = !$flg_comillas;
        } 
        
/* si hay un espacio en blanco y las comillas están cerradas */
        
if ($str_args{$i} == ' ' && !$flg_comillas) {
             
/* agregar al array y guardar la siguiente posición como inicio del próximo substring  */
            
array_push($arr_args,substr($str_args,$substr_init,$i-$substr_init));
            
$substr_init $i+1;
        }

    }
    
/* guardar el último substring   */
    
array_push($arr_args,substr($str_args,$substr_init,$i-$substr_init));
    
/*  acá va a haber un error, porque había comillas mal cerradas */
    
if ($flg_comillas) {
        echo 
"error, la cantidad de comillas es impar!!!";
        return 
false;
    }
    return 
$arr_args;
    
}

$str_args 'archivo.php parametro 0 "con espacios!" abc';
$arr_args parse_args($str_args);
echo 
'<pre>';
print_r($arr_args);
echo 
'</pre>';
?>
Algo a tener en cuenta es que no se está validando que haya más de un espacio en blanco como separador (cada espacio extra te saldría como un argumento). Se me ocurren un par de maneras rápidas de arreglarlo también, si hace falta. Por ej, agregando esta condición antes de la condición que hace el push.

Código PHP:
        /* si el caracter actual es un espacio y el anterior también, saltear */
        
if ($str_args{$i} == ' ' && $str_args{($i-1)} == ' ') {
            
$substr_init $i+1;
            continue;
        } 
No sé si será lo más "limpio" o "elegante", pero me parece que funciona.

Suerte
Califa

Última edición por califa010; 17/12/2006 a las 18:29