Старая знакомая ситуация: есть что-то, какой-то сервис, отдающий массивы PHP в формате функции var_export(), либо исторически сложилось так что что-то в системе отдает оформленные в код PHP массивы.
Например, ваш скрипт получает строки вида:
$test = "array('gmt' => 'Europe/Moscow',
'sudia3' => '',
'sudia1' => '',
'sudia2' => '',
'pos1' => '4-2-3-1',
'color1' => '#f00',
'pos2' => '4-4-1-1',
'color2' => '#000',
);";
Да, вы не ошиблись, бывает код PHP приходящий в строке. Один из вариантов разбора - eval(). Однако на разнородной системе это и дыра в безопасности.
При этом грамотным решением будет serialize() массива на той стороне, и unserialize() на вашей, или JSON. Однако, предположим, что в вашем проекте исторически сложилось так, что на "той" стороне это исправить на данный момент нельзя. А массив хочется "разобрать" безопасно.
В такой ситуации поможет ставшее стандартным(с PHP 4.2.0) расширение Tokenizer и его функция token_get_all().
Пример простенького разбора массива с ее помощью(пусть он у нас одномерный):
$test = array(
"'gmt' => 'Europe/Moscow',
'sudia3' => '',
'sudia1' => '',
'sudia2' => '',
'pos1' => '4-2-3-1',
'color1' => '#f00',
'pos2' => '4-4-1-1',
'color2' => '#000',
);";
$t = token_get_all($test);
$label = array();
foreach( $t as $k => $token) {
if(!is_array($token) ) {
unset($t[$k] );
} else {
list($id, $val) = $token;
if ( ($id == T_WHITESPACE) || ($id == T_VARIABLE) || ($id ==
T_BAD_CHARACTER) || ($id == T_OPEN_TAG) || ($id == T_ARRAY) || ($id == T_DOUBLE_ARROW) ) {
unset($t[$k] );
}
else {
}
}
}
$c = count($t);
if ($c % 2 == 0) {
$arr = array();
$k = array_keys($t);
$cc = $c /2;
for ($i = 0; $i < $cc; $i ++) {
$key = trim($t[$k[2*$i] ] [1], '\'"');
$val = trim($t[$k[2*$i + 1] ] [1], '\'"');
$arr[$key] = $val;
}
// а вот и наш исходный массив
var_dump($arr);
} else {
echo "Parse error\n";
}
Длиннее чем eval()? Да! За код будет спокойнее чем за eval()? Однозначно - да.