fork download
  1. <?php
  2.  
  3. $prevhtml = '
  4. <div class="foo">
  5. <div>FOO</div>
  6.  
  7. <div class="bar">
  8. <div>BAR</div>
  9. </div>
  10.  
  11. <div>FOOBAR<div class="foobar"></div></div>
  12.  
  13. <div class="bar"><div><b>BAR</b></div></div>
  14.  
  15. <!-- para este caso, deberás ejecutar preg_replace
  16. hasta que no haya nada nuevo por reemplazar -->
  17. <div><div>foobar</div></div>
  18. </div>
  19.  
  20. ';
  21.  
  22. $newhtml = '';
  23. while($newhtml != $prevhtml) {
  24. if (!empty($newhtml)) $prevhtml = $newhtml;
  25. $newhtml = preg_replace(
  26. '/<div>((?:<div[^>]*>(?1)<\/div>|[^<]*|<(?!div))*)<\/div>/smi'
  27. ,'<p>$1</p>'
  28. ,$prevhtml);
  29. }
  30.  
  31. print $newhtml;
  32.  
Success #stdin #stdout 0.02s 23880KB
stdin
Standard input is empty
stdout
<div class="foo">
<p>FOO</p>

  <div class="bar">
     <p>BAR</p>
  </div>

  <p>FOOBAR<div class="foobar"></div></p>

  <div class="bar"><p><b>BAR</b></p></div>

  <!-- para este caso, deberás ejecutar preg_replace 
       hasta que no haya nada nuevo por reemplazar -->
  <p><p>foobar</p></p>
</div>