функция php eval не любит двоеточия - PullRequest
0 голосов
/ 02 июня 2011

Я использую eval для создания ассоциативного массива из php, встроенного в xml-парсер (не фанат того, как настраивается массив). Конкретный XML, который я использую, является ответом First Data, и теги и атрибуты имеют двоеточия, которые, по-видимому, действительно не нравится функции eval.

Я пытался убежать от двоеточия, но Эвал без ума от косой черты (и спасшейся косой черты). Какой хороший способ подготовить строки для функции eval?

function get_XML_Array($XML) {

    $error = true ;

    $parser = xml_parser_create() ;

    xml_parse_into_struct($parser, $XML, $set) ;

    xml_parser_free($parser);

    include_once(DIR_ROOT . "Tools/escape_Colon.php") ;

    if($error){echo_Array($set);}

    foreach($set as $key => $value) {
        foreach($set[$key] as $key_2 => $value_2){
            $set[$key][$key_2] = escape_Colon($value_2) ;
            foreach($set[$key]['attributes'] as $key_3 => $value_3){
                $set[$key]['attributes'] = escape_Colon($value_3) ;
            }
        }
    }

    $Array = array();
    $arr_str = '$Array' ;
    $arr_str_i = '$Array' ;
    $inc = 0 ;

    $level = 1 ;

    foreach($set as $key => $value) {
        if($set[$key]['level'] >= $level){
            $arr_str_i .= '[\''.$set[$key]['tag'].'\']' ;
            if(!preg_match('/^(\s)*$/', $set[$key]['value'])){
                $str = '$inc = '.$arr_str_i.'[\'increment\'] ;' ;
                eval($str) ;
                $str = $arr_str_i.'[\'value\'][\''.($inc?$inc:0).'\'] = \''.$set[$key]['value'].'\';' ;
                eval($str) ;
                $str = $arr_str_i.'[\'increment\']++ ;' ;
                eval($str) ;
            }
                foreach($set[$key]['attributes'] as $att_key => $att_value){
                    $str = $arr_str_i.'[\'attributes\'][\''.$att_key.'\'] = \''.$att_value.'\';' ;
                    eval($str) ;
                }

            if($set[$key+1]['level'] >= $level){
                $arr_str = $arr_str_i ;
            }
            }elseif($set[$key]['level'] == 1){
            $arr_str = '$Array' ;
            $arr_str_i = '$Array' ;
            $level = 1 ;
            $arr_str_i .= '['.$set[$key]['tag'].']' ;           
        }else{
            $level = $set[$key]['level'] ;
            $arr_str_i = $arr_str ;
        }

    $level++ ;
    }

    return $Array ;
}

?>

Ответы [ 2 ]

2 голосов
/ 02 июня 2011

Do not use eval(). Насколько я вижу, все, начиная с eval(), можно заменить соответствующим кодом PHP. Например:

$str = $arr_str_i.'[\'attributes\'][\''.$att_key.'\'] = \''.$att_value.'\';' ;
eval($str) ;

можно заменить на:

$Array['attributes'][$att_key] = $att_value;

так почему вы хотите слишком сильно усложнить свою жизнь? IDE поможет вам (например, с указанием типов данных), если вы просто последуете обычным, лучшим способом.

0 голосов
/ 02 июня 2011

Это исходит от JS, но применимо здесь: eval - зло , нет причины, по которой вы не можете делать это напрямую вместо eval.

С другой стороныПохоже, что функции SimpleXML в php будут лучшим выбором для вас simplexml_load_string.

...