<?php
$s = '10|updatePanel|h2.header|Привет мир|20|updatePanel|p.search|Элементов не найдено|0|deleteBox|#results||';
mb_internal_encoding('UTF-8');
function fetchBlock($str, $offset)
{
$p = mb_strpos($str, '|', $offset);
if (false === $p) {
return null;
}
$size = (int)mb_substr($str, $offset, $p-$offset);
$offset = $p+1;
$p = mb_strpos($str, '|', $offset);
$name = mb_substr($str, $offset, $p-$offset);
$offset = $p+1;
$p = mb_strpos($str, '|', $offset);
$key = mb_substr($str, $offset, $p-$offset);
$offset = $p+1;
$value = mb_substr($str, $offset, $size);
$offset = $offset+mb_strlen($value);
return array('offset' => $offset+1, 'block' => array($name => array($key => $value)));
}
$result = array();
$block = array('offset' => 0);
while ($block = fetchBlock($s, $block['offset'])) {
$result = array_merge_recursive($result, $block['block']);
}
print_r($result);
На регулярках можно сделать компактнее, но для больших текстов (не как тут одной строкой) так будет пошустрее.