Ich würde das mittels preg_match_all() lösen
$items = array();
preg_match_all('~<ul class="foo">(.*)</ul>~iUs', $html, $aul, PREG_PATTERN_ORDER);
foreach($aul[1] as $value) {
preg_match_all('~<li class="([^"]+)">([^<]+)</li>~iUs', $value, $ali, PREG_PATTERN_ORDER);
$items['foo'][] = array_combine($ali[1], $ali[2]);
}
Wenn du nur Text innerhalb der li hast, dürften die Pattern das gewünschte ergeben.