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