PHP中的字符串解析
我正在尝试用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) 子属性(例如>名称,>年龄) 注意:属性不是固定的,也不总是用单个空格分隔 其值有两
-father_name "John" -father_weight 44.50
-kid >name "Marko" >age 12
-kid >name "Sevda" >age 17
-kid >name "Nathan" >age 19
主要有两种形式:
$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);编辑以反映修复。谢谢!