das setzt voraus, dass nur eine einzige <ul> auf der Seite existiert, da Dein Muster gierig ist und den Fall, dass zwischen zwei <ul>-Elementen andere Inhalte stehen, keine Vorkehrungen trifft. Außerdem würde ich die Klasse nicht fest codieren, sondern lieber <ul(?: [^>]*)?> notieren...
Dafür wird der Modifier U eingesetzt
<pre><?php
$html = <<<EOTHTML
<html>
<head>
<title>Titel</title>
</head>
<body>
<div>text</div>
<ul class="foo">
<li class="bar">abc</li>
<li class="bla">123</li>
<li class="blub">a1b2c3</li>
</ul>
<div>text</div>
<ul class="foo">
<li class="bar1">abc</li>
<li class="bla1">123</li>
<li class="blub1">a1b2c3</li>
</ul>
<div>text</div>
<ul class="foo">
<li class="bar2">abc</li>
<li class="bla2">123</li>
<li class="blu2b">a1b2c3</li>
</ul>
<div>text</div>
</body>
</html>
EOTHTML;
$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]);
}
print_r($items);
Ergibt:
Array
(
[foo] => Array
(
[0] => Array
(
[bar] => abc
[bla] => 123
[blub] => a1b2c3
)
[1] => Array
(
[bar1] => abc
[bla1] => 123
[blub1] => a1b2c3
)
[2] => Array
(
[bar2] => abc
[bla2] => 123
[blu2b] => a1b2c3
)
)
)
Aber der Einwand mit der class ist schon richtig.