Анализ строк в PHP

Я пытаюсь проанализировать строку в PHP:

-father_name "John" -father_weight 44.50 -kid >name "Marko" >age 12 -kid >name "Sevda" >age 17 -kid >name "Nathan" >age 19 

Существуют две основные ФОРМЫ:

  1. Атрибуты (например, -father, -weight, -kid)
  2. Суб-атрибуты (например,> имя, возраст)

Примечание. Атрибуты НЕ ФИКСИРОВАНЫ и НЕ ВСЕГДА СДЕЛАТЬСЯ на одном пространстве

И их ЦЕННОСТИ имеют два типа:

  1. Строка (например, «Марко»)
  2. Int или Decimal (например, 12.00)

OUTPUT будет:

  $array['attributes'] = array('father_name ','father_weight '); $array['attributes']['kid'][] = array('name' => "Marko", 'age' => 12); $array['attributes']['kid'][] = array('name' => "Sevda", 'age' => 17); $array['attributes']['kid'][] = array('name' => "Nathan", 'age' => 19); 

Он должен возвращать FORMS (attrs и sub-attrs) и VALUES ОТДЕЛЬНО.

Как я могу анализировать эту строку в PHP ловко?

Последнее примечание: Решение, которое я нашел для этого: YAML.

Попробуйте следующее:

 function parse_attributes($string, $separators = array('-','>'), $level = 0){ $attributes = explode($separators[$level], $string); $attrs = array(); $ret_arr = array(); foreach($attributes as $attribute){ if(!empty($attribute)){ $ex_attr = explode(' ',$attribute); if(!empty($ex_attr[1])){ if(count($separators) > $level && strpos($attribute, $separators[$level+1])){ $ret = parse_attributes($attribute, $separators, $level+1); array_push($ret_arr, $ret); } if (empty($ret_arr)) $attrs[$ex_attr[0]] = str_replace('"', '', $ex_attr[1]); else $attrs[$ex_attr[0]] = $ret_arr; } } } return $attrs; } 

С помощью:

 $returned = parse_attributes('-father_name "John" -father_weight 44.50 -kid >name "Marko" >age 12 -kid >name "Sevda" >age 17 -kid >name "Nathan" >age 19'); print_r($returned); 

Возвращает:

 Array ( [father_name] => John [father_weight] => 44.50 [kid] => Array ( [0] => Array ( [name] => Marko [age] => 12 ) [1] => Array ( [name] => Sevda [age] => 17 ) [2] => Array ( [name] => Nathan [age] => 19 ) ) ) 

И используя:

 echo($returned['kid'][0]['name']); 

Возвращает:

Marko

ПРИМЕЧАНИЕ. Вы можете указать больше элементов массива разделителя, элемент для каждого уровня атрибута, который у вас есть.

Надеюсь это поможет.

 $output = array(); $input = explode('-', $input); foreach ($input as $attribute) { $attribute = explode('>', $attribute); if (count($attribute) == 1) { $attribute = explode(' ', trim($sub_attribute), 2); $output[$attribute[0]] = eval($attribute[1]); } else { $attribute_name = trim($attribute[0]); if (!isset($output[$attribute_name]) { $output[$attribute_name] = array(); } $sub_attribute_output = array(); for ($i = 1; $i < count($attribute); $i++) { $sub_attribute = explode(' ', trim($attribute[$i]), 2); $sub_attribute_output[$sub_attribute[0]] = eval($sub_attribute[1]); } $output[$attribute_name][] = $sub_attribute_output; } }