personally i think people use regex for templates way more often than they need to. sometimes they are definaely warranted, but i see most people using them when either a simple str_replace would work, or when an include would be more suitable.
i also dont see why people want to keep php code out of templates so religiously. the only argument ive really heard is they dont want thier designers messing things up. but if they touch your custom "tag" your template is gonna fail anyway just like if they touched your php code.....
this is essentailly how i do it. its a basic striaghtforward approach that doesnt try to reinvent the wheel. of course this example is extremely basic, implementation exercise left to the reader.
<?php
// index.php or main page etc....
$header = set_include_header($header_args);
$nav = set_include_nav($nav_args);
$body = set_include_body($body_args);
$template = set_template($template_args);
include($template);
?>
// template.php
<html>
<body>
<h1><?php include($header); ?></h1>
<div><?php include($nav); ?></div>
<?php include($body); ?>
</body
</html>
now of course you dont need to include() everything, you could just as easily have set_include_header() be called generate_header() or whatever and then just echo the result as a string.
and you can have a set_css() set_footer() and so on to your hearts desire.
the concept is really just a set of arguments which cascade thier arguments into other sets of arguments.