Skafoi: regexp für verschachtelte links

Beitrag lesen

Hat jemand eine Idee, ob das mit regexp überhaupt geht, bzw. wie man es sonst machen könnte?

Hier noch ein kleines Beispiel wie so etwas ohne regulären Ausdruck funktionieren könnte. Ist nur schnell hinprogrammiert - übernehme somit keine Haftung für Fehler. Dauert zudem mMn recht lange, das optimieren überlasse ich da aber gerne dir. Die Funktion remove_parent_attribute hab ich nur eingebaut, damit man anschließend auch das ganze schön mit print_r ausgeben lassen kann und nicht versucht das durch ['parent'] entstandene rekursive Array auszugeben.

<?php

$text = '<bar>abc <foo>innen anfang <foo>ganz innen </foo>blindtext </foo>innen ende <foo>auch innen </foo>xyu </bar>';

$data = array();
$data['parent'] = null;
$data['type'] = 'base';
$data['children'] = array();
$data['length'] = 0;

$data_pointer = &$data;

$open_token = array('foo', 'bar');
$close_token = array('/foo', '/bar');

$temp_expl = explode('<', $text);

foreach($temp_expl as $temp_value) {

if (empty($temp_value)) continue;

$temp_expl2 = explode('>', $temp_value);

if (in_array($temp_expl2[0], $open_token)) {

$temp_a = array();
  $temp_a['parent'] = &$data_pointer;
  $temp_a['type'] = $temp_expl2[0];
  $temp_a['children'] = array();
  $temp_a['length'] = 0;

$data_pointer['children'][++$data_pointer['length']] = $temp_a;

$data_pointer = &$data_pointer['children'][$data_pointer['length']];

} else if (in_array($temp_expl2[0], $close_token)) {

$temp_type = substr($temp_expl2[0], 1);
  if ($temp_type == $data_pointer['type']) {
   $data_pointer = &$data_pointer['parent'];
  } else {
   // fehler beim parsen
  }

} else {

// fehler beim parsen

}

if (!empty($temp_expl2[1])) {

$temp_a = array();
  $temp_a['type'] = 'text';
  $temp_a['length'] = strlen($temp_expl2[1]);
  $temp_a['text_value'] = $temp_expl2[1];

$data_pointer['children'][++$data_pointer['length']] = $temp_a;

}

if (!empty($temp_expl2[2])) {

// fehler beim parsen

}

}

function remove_parent_attribute(&$data) {
 if (!empty($data['children'])) foreach($data['children'] as $k=>$v) {
  remove_parent_attribute($data['children'][$k]);
 }
 unset($data['parent']);
}

remove_parent_attribute($data);

print_r($data);

?>