name "Marko" >age 12 -ki-6ren">
gpt4 book ai didi

php - PHP 中的字符串解析

转载 作者:可可西里 更新时间:2023-11-01 01:09:24 26 4
gpt4 key购买 nike

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

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

主要有两种形式:

  1. 属性(例如-父亲、-体重、- child )
  2. 子属性(例如>姓名、>年龄)

注意:属性不是固定的,也不总是由单个空格分隔

它们的 VALUES 有两​​种类型:

  1. 字符串(如“Marko”)
  2. 整数或十进制(如 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);

它应该分别返回FORMS(属性和子属性)和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']);

返回:

马可

注意:您可以指定更多分隔符数组项,每个属性级别对应一个项。

希望这对您有所帮助。

关于php - PHP 中的字符串解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4617636/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com