php - How to wrap the elements by div according to the elements tree structure? -


i have been doing 2 days no luck. tried in both using dom parser class , loop method both of them confusing lot , couldn't solution.

objective: need wrap h tags div. parent-child relationship h1->h2->h3 , on. so, need wrap div according tree structure.

html

$html='<h1>some text<h1> sometext <h2>some text</h2> sometext  <h1>some text<h1> sometext <h2>some text</h2> sometext <h3>some text</h3> sometext'; 

expected output

<div class="sect1"> <h1>some text<h1> sometext <div class="sect2"> <h2>some text</h2> sometext </div> </div>  <div class="sect1"> <h1>some text<h1> sometext <div class="sect2"> <h2>some text</h2> sometext <div class="sect3"> <h3>some text</h3>  sometext </div> </div> </div> 

attempt 1:

$dom = new domdocument(); $dom->loadhtml($html); $elements = $dom->getelementsbytagname('*');          ($i = 0; $i < $elements->length; $i++) {                     $element = $elements->item($i);         if ($element->tagname == 'h1'){             $wrap1 = $dom->createelement('div');            $wrap1->setattribute('class', 'sect1');              $wrap1->appendchild($element);             $dom->appendchild($wrap1);         }         if ($element->tagname == 'h2'){             $wrap2 = $dom->createelement('div');            $wrap2->setattribute('class', 'sect2');              $wrap2->appendchild($element);             $wrap1->appendchild($wrap2);             $dom->appendchild($wrap1);         }     }      

attempt 2:

$f=file("extractedadd.xhtml"); for($i=0;$i<count($f);$i++){     if(strpos($f,'<h1 class="title"')!==false);     $h1[].=$i;   } $h2count=0; $h3count=0; for($j=0;$j<count($h1);$j++){   for($k=$h1[$j];$k<$h1[$j+1];$k++){       if(strpos($f[$k],'<h2 class="title"')!==false){$h2=$h2count+1;}       if(strpos($f[$k],'<h3 class="title"')!==false){$h3=$h3count+1;}   }  if($h2count!=0){  for($z=1;$z<=$h2count;$z++){      $to2.="</div>\n";  }  $r=str_replace('<h1 class="title"',$to2."</div>\n".'<h1 class="title"',$h1[$j]);  $to2=""; }//something this. 

pls help! how expected solution?

i make little more difficulty structure

$html='<h1>some text<h1> sometext <h2>some text</h2> sometext  <h2>some text</h2> 1 more sometext  <h1>some text<h1> sometext <h2>some text</h2> sometext <h3>some text</h3> sometext';  $level = 0; $array = split("\n", $html); // make array of lines foreach($array $line)  {   if (preg_match('/\s*\<h(\d+)/i', $line, $matches)) {      $l = $matches[1];  // take new level tag h      if ($level == $l) echo "</div>\n<div class=\"sect.$l.\">\n"; // same level      else {         while ($level >= $l) {echo "</div>\n"; $level--; }         while ($level < $l) {echo "<div class=\"sect".$l."\">\n"; $level++; }      }   }   echo $line."\n";    } while ($level >= 1) {echo "</div>\n"; $level--; } // close not closed :) 

whatch there working


Comments