Su ejemplo eval es deficiente el valor de retorno:
print eval("return $sItem;");
debería hacerlo:
$aData['test'] = 'foo';
$sItem = '$aData[\'test\']';
print eval("return $sItem;"); # foo
Pero no se recomienda utilizar eval normalmente. Puedes ir a la cocina del infierno con ella porque eval es malvado.
En su lugar sólo analizar la cadena y regresar el valor:
$aData['test'] = 'foo';
$sItem = '$aData[\'test\']';
$r = sscanf($sItem, '$%[a-zA-Z][\'%[a-zA-Z]\']', $vName, $vKey);
if ($r === 2)
{
$result = ${$vName}[$vKey];
}
else
{
$result = NULL;
}
print $result; # foo
Esto se puede hacer con cualquier otra forma de expresión regular también.
Como su sintaxis es muy parecida a PHP y en realidad es un subconjunto de ella, hay alguna alternativa que puede hacer si quiere validar la entrada antes de usar eval. El método es verificar contra tokens PHP y solo permite un subconjunto. Esto no valida la cadena (por ejemplo, la sintaxis y si una variable se establece en realidad), pero hace que sea más estricta:
function validate_tokens($str, array $valid)
{
$vchk = array_flip($valid);
$tokens = token_get_all(sprintf('<?php %s', $str));
array_shift($tokens);
foreach($tokens as $token)
if (!isset($vchk[$token])) return false;
return true;
}
Usted acaba de dar una serie de símbolos válidos para esa función. Esas son las fichas de PHP, en su caso, estos son:
T_LNUMBER (305) (probably)
T_VARIABLE (309)
T_CONSTANT_ENCAPSED_STRING (315)
A continuación, sólo se puede usar y funciona con claves más complicados, así:
$aData['test'] = 'foo';
$aData['te\\\'[]st']['more'] = 'bar';
$sItem = '$aData[\'test\']';
$vValue = NULL;
if (validate_tokens($sItem, array(309, 315, '[', ']')))
{
$vValue = eval("return $sItem;");
}
He utilizado este en another answer de la cuestión reliably convert string containing PHP array info to array.
@all: gracias a todos ustedes, por lo que planeo hacer (en gran pantalla) es La mejor solución para mí al usar la función eval ... simplemente me olvido de usar return – nabizan