<?php
$html = <<<HTML
<html>
<head>
</head>
<body>
<script>
$('h1').addClass('header');
</script>
<h1>DOMDocument</h1>
<p>Text<p>
<script src="jquery.js"></script>
<!-- inline php should appear below -->
</body>
</html>
HTML;
echo move_script($html);
function move_script($html)
{
$dom = new DOMDocument();
$dom->recover = true;
//$dom->substituteEntities = true;
$dom->formatOutput = true;
$dom->preserveWhiteSpace = false;
// set error level
//$internalErrors = libxml_use_internal_errors(true);
$dom->loadHTML($html);
// Restore error level
//libxml_use_internal_errors($internalErrors);
$xpath = new DOMXPath($dom);
// grab the inline scripts.
$script_tags = $xpath->query('//body//script[not(@src)]');
$mainBody = @$dom->getElementsByTagName('body')->item(0);
foreach ($script_tags as $tag) {
$mainBody->appendChild($tag->cloneNode(true));
$tag->parentNode->removeChild($tag);
}
return $dom->saveHTML();
}
PD9waHAKJGh0bWwgPSA8PDxIVE1MCjxodG1sPgoJPGhlYWQ+Cgk8L2hlYWQ+Cgk8Ym9keT4KCQk8c2NyaXB0PgoJCQkkKCdoMScpLmFkZENsYXNzKCdoZWFkZXInKTsKCQk8L3NjcmlwdD4KCQk8aDE+RE9NRG9jdW1lbnQ8L2gxPgoJCTxwPlRleHQ8cD4KCQk8c2NyaXB0IHNyYz0ianF1ZXJ5LmpzIj48L3NjcmlwdD4KCQkKCQk8IS0tIGlubGluZSBwaHAgc2hvdWxkIGFwcGVhciBiZWxvdyAtLT4KCTwvYm9keT4KPC9odG1sPgpIVE1MOwoKZWNobyBtb3ZlX3NjcmlwdCgkaHRtbCk7CgpmdW5jdGlvbiBtb3ZlX3NjcmlwdCgkaHRtbCkKewoJJGRvbSA9IG5ldyBET01Eb2N1bWVudCgpOwoJJGRvbS0+cmVjb3ZlciA9IHRydWU7CgkvLyRkb20tPnN1YnN0aXR1dGVFbnRpdGllcyA9IHRydWU7CgkkZG9tLT5mb3JtYXRPdXRwdXQgPSB0cnVlOwoJJGRvbS0+cHJlc2VydmVXaGl0ZVNwYWNlID0gZmFsc2U7CgkKCS8vIHNldCBlcnJvciBsZXZlbAoJLy8kaW50ZXJuYWxFcnJvcnMgPSBsaWJ4bWxfdXNlX2ludGVybmFsX2Vycm9ycyh0cnVlKTsKCSRkb20tPmxvYWRIVE1MKCRodG1sKTsKCS8vIFJlc3RvcmUgZXJyb3IgbGV2ZWwKCS8vbGlieG1sX3VzZV9pbnRlcm5hbF9lcnJvcnMoJGludGVybmFsRXJyb3JzKTsKCgkkeHBhdGggPSBuZXcgRE9NWFBhdGgoJGRvbSk7CgkvLyBncmFiIHRoZSBpbmxpbmUgc2NyaXB0cy4KCSRzY3JpcHRfdGFncyA9ICR4cGF0aC0+cXVlcnkoJy8vYm9keS8vc2NyaXB0W25vdChAc3JjKV0nKTsKCgkkbWFpbkJvZHkgPSBAJGRvbS0+Z2V0RWxlbWVudHNCeVRhZ05hbWUoJ2JvZHknKS0+aXRlbSgwKTsKCWZvcmVhY2ggKCRzY3JpcHRfdGFncyBhcyAkdGFnKSB7CgkgICAgJG1haW5Cb2R5LT5hcHBlbmRDaGlsZCgkdGFnLT5jbG9uZU5vZGUodHJ1ZSkpOwoJICAgICR0YWctPnBhcmVudE5vZGUtPnJlbW92ZUNoaWxkKCR0YWcpOwoJfQoKCXJldHVybiAkZG9tLT5zYXZlSFRNTCgpOwp9Cg==