quick, dirty & ready ?
$this->addHookAfter('Page::render', function ($event) {
if ($this->page->template != 'admin') {
// just an example I use in almost every PW site: add responsive wrappers around iFrames:
if (strpos($event->return, 'videoWrapper') === false) {
$event->return = str_replace("<iframe", "\n<div class='videoWrapper'><iframe", $event->return);
$event->return = str_replace("</iframe>", "</iframe></div>", $event->return);
}
// another example I use in almost every PW site: add responsive wrappers around tables:
if (strpos($event->return, 'scrollTable') === false) {
$event->return = str_replace("<table", "\n<div class='scrollTable'><table", $event->return);
$event->return = str_replace("</table>", "</table></div>", $event->return);
}
$cleaned = preg_replace('~(<h[23]\\b.*?>(?:<[a-z][^>]*>)*)(\w+)~ism', '$1<span>$2</span>', $event->return); // BitPoet's regex magic
$event->return = preg_replace('/<p>\\s*?(<a .*?><img.*?><\\/a>|<img.*?>)?\\s*<\\/p>/s', '\1', $cleaned); // remove default paragraphs around images in CKE
}
});