Отличное небольшое решение xml2array - (c) Vladson. Мне показалось, что можно было бы его чуть-чуть развить, и получилось: PHP: <?php // // Parse XML data into an array // function xml2array($text) { $reg_exp = "/<(\w+)([^>]*)>(.*?)<\/\\1>/s"; preg_match_all($reg_exp, $text, $match); foreach ($match[1] as $key=>$val) { $index = count($array[$val]); if (strlen($all_args=trim($match[2][$key]))) { preg_match_all("/[\s]*([^\=]+)\=[\"']*(.*?)[\"']+[\s]*/ms",$all_args,$arg); for( $j=0; $j < count($arg[1]); $j++ ) $array[$val][$index]['arg'][ $arg[1][$j] ] = $arg[2][$j]; } $data = trim($match[3][$key]); $array[$val][$index]['data'] = (substr($data,0,9)=='<![CDATA[') || !preg_match($reg_exp,$data) ? preg_replace("/(^(\/\/|\/\*)\s*<!\[CDATA\[\s*|\s*(\/\/|\*\/)\s*\]\]>$)/mi",'',html_entity_decode($data)) : xml2array($data); } return $array; } ?> Внимание! этот код создает массив несколько другой структуры, и его нельзя использовать вместо оригинала не изменив обработку возвращаемого массива! К недостаткам можно отнести пожалуй то, что корректно обрабатывается только валидный код, а также некорректно будут обработаны параметры тегов у которых есть вложенные кавычки типа "двойная-одинарная-двойная" (понятно изъясняюсь?) К этому коду можно было бы еще приделать обработку тегов без закрывающей части (которые должны закрываться "/>" ), тогда эта крохотная функция могла бы стать довольно полезным инструментом.
Ты не первый кто делает ремейк (аналогов также много в каментах про XML в мануале на php.net) Однако твой вариант мне нравится больше так как он не перегружен излишествами...
я там крайне редко встречал что-либо интересное, зато там невероятно много ерунды и криворукости/кривоголовости.
Этого там БОЛЬШЕ чем можно представить... Даже моя функция xml2array там в немного другом виде (в ламерском), регулярку подправил один из первых людей кому эта функция понравилась
А мож сделать функцию более глубоким, в смысле чтоб вместо xml2array($text) сделать xml2array($file) ? наверное поняли
NIKO, в этом нет необходимости, поскольку задача часто бывает не из файла (или url) данные брать, а из других источников. А сделать "обложку" вида: PHP: <?php $s = xml2array(file_get_contents("filename.xml")); ?> не так и сложно...
А можно сделать так... Код (Text): function xml2array($text, $is_file=false) { if ($is_file) $text = file_get_contents($text); Таким образом по дефолту функция не будет отличаться от оригинала Код (Text): $array = xml2array($string); а для парсинга файла достаточно будет добавит один параметр Код (Text): $array = xml2array($filename, true);
Чуть-чуть переделал. Теперь она нормально обрабатывает и "одиночные" узлы (тэги) типа <tagname aaa="bbb" /> PHP: <?php function xml2array($text) { $reg_exp = "/<(\w+)([\s]+([^>]*)\/|\/|([^>]*)>(.*?)<\/\\1)>/ms"; preg_match_all($reg_exp, $text, $match); foreach ($match[1] as $key=>$val) { $index = isset($array[$val]) ? count($array[$val]) : 0; $n = ($hasChildren = strlen($data = trim($match[5][$key]))) ? 4 : 3; if ($alen=strlen($all_args=trim($match[$n][$key]))) { $array[$val][$index]['params'] = parse_args($all_args[$alen-1]=='/'?substr($all_args,0,$alen-1):$all_args); } else $array[$val] = array(); if ($hasChildren) $array[$val][$index]['nodes'] = (substr($data,0,9)=='<![CDATA[') || !preg_match($reg_exp,$data) ? preg_replace("/(^(\/\/|\/\*)\s*<!\[CDATA\[\s*|\s*(\/\/|\*\/)\s*\]\]>$)/mi",'',html_entity_decode($data)) : xml2array($data); } return $array; } ?> Я не привожу здесь используемую функцию преобразования строки аргументов в массив parse_args() - не о ней речь. Теперь у этой функции есть только один принципиальный недостаток - она неверно обрабатывает одинаковые вложенные узлы (тэги)