Разбор строк в PHP - PullRequest
       2

Разбор строк в PHP

3 голосов
/ 06 января 2011

Я пытаюсь разобрать строку в 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 или Десятичный (например, 12.00)

ВЫХОД будет:

 $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);

Возвращается ФОРМЫ (attrs и sub-attrs) и VALUES ОТДЕЛЬНО.

Как мне разобрать эту строку в PHP умно?

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

Ответы [ 2 ]

3 голосов
/ 07 января 2011

Попробуйте это:

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

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

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

1 голос
/ 06 января 2011
$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;
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...