DiBo33: Element und Kinder aus XHTML extrahieren und zu XML

Beitrag lesen

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.