Foros del Web » Programando para Internet » PHP »

Argument count

Estas en el tema de Argument count en el foro de PHP en Foros del Web. hola, necesito hacer una funcion que me devuelva los "argumentos" pasados por una cadena.. por ejemplo: la cadena es: Código: archivo.php parametro 0 "con espacios!" ...
  #1 (permalink)  
Antiguo 17/12/2006, 01:31
Avatar de Wdeah  
Fecha de Ingreso: julio-2005
Ubicación: Argentina
Mensajes: 109
Antigüedad: 18 años, 9 meses
Puntos: 0
Argument count

hola, necesito hacer una funcion que me devuelva los "argumentos" pasados por una cadena..
por ejemplo: la cadena es:

Código:
archivo.php parametro 0 "con espacios!"
devolveria:

Código:
Array
(
    [0] => archivo.php
    [1] => parametro
    [2] => 0
    [3] => con espacios!
)
creo que puede hacerse con expresiones regulares, pero con lo bien que me llevo con ellas, me volveria un paty antes de poder lograrlo xD
gracias.
  #2 (permalink)  
Antiguo 17/12/2006, 01:45
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 19 años, 8 meses
Puntos: 102
Re: Argument count

¿y esa cadena de dónde proviene?, ¿el formato es tal cuál lo pones?, ¿no basta con un explode()?

www.php.net/explode

__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"
  #3 (permalink)  
Antiguo 17/12/2006, 01:55
Avatar de Wdeah  
Fecha de Ingreso: julio-2005
Ubicación: Argentina
Mensajes: 109
Antigüedad: 18 años, 9 meses
Puntos: 0
Re: Argument count

la cadena viene por POST desde un form, el formato es generico..
puede ser asi, tambien puede ser

parametro1 parametro2

valor "argumento con espacios"

el tema es que si hago explode(' ', $cadena)

el argumento ' "argumento con espacios" '

me quedaria

array[0] = argumento
array[1] = con
array[2] = espacios

no se si me explico bien..

seria una especie de linea de comando lo que tengo que parsear...
los argumentos van separados por espacios en blanco, en el caso de que un argumento contenga algun espacio, este debe ser encerrado entre comillas..

gracias.
  #4 (permalink)  
Antiguo 17/12/2006, 18:20
 
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
  #5 (permalink)  
Antiguo 17/12/2006, 23:58
Avatar de Wdeah  
Fecha de Ingreso: julio-2005
Ubicación: Argentina
Mensajes: 109
Antigüedad: 18 años, 9 meses
Puntos: 0
Re: Argument count

Hola califa, gracias por coparte! yo hice algo parecido, nada mas que si hay una sola comilla, la toma como parte de un argumento en el caso de que halla espacios como separador.

el code por si alguien mas quiere inventar algo raro:

Código PHP:
function command ($command)
{
    
$cmd ereg (' '$command) ? substr ($command0strpos ($command' ')) : $command;

    
$isCommand = ( !empty ($cmd) && !ereg ("\n"$cmd) && !ereg ('[^a-z_]'$cmd) ) ? true false;
    
    return 
$isCommand ? array ( $cmdgetValues ( ( ereg (' '$command) ? substr $commandstrpos ($command' ') ) : null ) ) ) : null;
}


function 
getValues ($cmd)
{
    if (
$cmd == null)
    {
        return 
null;
    }
    
    
$result = array ();
    
$position 0;
    
    while ( ( 
$position strpos $cmd'"'$position ) ) !== false )
    {
        
$position++;
        
        if ( ( 
$scloserP strpos $cmd'"'$position ) ) !== false )
        {
            
$result[] = trim substr $cmd$position$scloserP $position ) );
            
$position $scloserP 1;
        }
    }
    
    if (
$result != null)
    {
        return 
$result;
    }
    else
    {
        
$v explode (' '$cmd);
        
$i 1;
        while ( isset (
$v[$i]) )
        {
            
$result[] = trim ($v[$i]);
            
$i++;
        }
    
        return (
$result != null) ? $result null;
    }

saludos.
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 22:53.