PHP中的字符串解析

PHP中的字符串解析,php,parsing,Php,Parsing,我正在尝试用PHP解析字符串: -father_name "John" -father_weight 44.50 -kid >name "Marko" >age 12 -kid >name "Sevda" >age 17 -kid >name "Nathan" >age 19 主要有两种形式: 属性(例如-father、-weight、-kid) 子属性(例如>名称,>年龄) 注意:属性不是固定的,也不总是用单个空格分隔 其值有两

我正在尝试用PHP解析字符串:

 -father_name "John" -father_weight 44.50 
    -kid >name "Marko" >age 12
    -kid >name "Sevda" >age 17
    -kid >name "Nathan" >age 19
主要有两种形式:

  • 属性(例如-father、-weight、-kid)
  • 子属性(例如>名称,>年龄)
  • 注意:属性不是固定的,也不总是用单个空格分隔

    其值有两种类型:

  • 字符串(如“Marko”)
  • 整数或小数(如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);
    
    它应该分别返回表单(属性和子属性)和

    如何在PHP中巧妙地解析这一行

    最后一点注意:我为此找到了解决方案:YAML

    $output=array();
    
    $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;
       }
    }
    
    $input=分解('-',$input); foreach($input as$属性){ $attribute=分解('>',$attribute); 如果(计数($attribute)==1){ $attribute=分解(“”,修剪($sub_属性),2); $output[$attribute[0]]=eval($attribute[1]); }否则{ $attribute_name=trim($attribute[0]); 如果(!isset($output[$attribute\u name]){ $output[$attribute_name]=array(); } $sub_属性_输出=数组(); 对于($i=1;$i
    试试这个:

    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']);
    
    返回:

    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
                    )
    
            )
    
    )
    
    马尔科

    注意:您可以指定更多分隔符数组项,这是您拥有的每个属性级别的一个项


    希望这能有所帮助。

    您能给出一个输出示例吗?源文件来自哪里?理想情况下,这种类型的文件应该是用xml创建的,这样会更容易解析。输入格式是不变的吗?现成的PHP解析器(如YAML)也有类似的格式属性是固定的还是任意的?属性是否总是由一个空格分隔?多个空格?选项卡?未经测试,但应在所有情况下都能工作。如果没有,请告诉我。eval()处理到字符串、int或float的转换。首先,如果(unset($output[$attribute_name]),这里会出现问题类型转换的评估?听起来很邪恶!是的,将unset改为!isset。写得很快,试图击败其他答案哈哈。@dino beytar good call。应该是$sub_attribute=explode(“”,trim($attribute[$i]),2);编辑以反映修复。谢谢!