Это лучшее решение, которое я придумал.
Сначала заменили все <и> для HTML-кода, а затем вернули обратно разрешенные теги.
<?php
$original_str = "<html><b>test</b><strong>teste</strong></html>";
$allowed_tags = array("b", "strong");
$sans_tags = str_replace(array("<", ">"), array("<",">"), $original_str);
$regex = sprintf("~<(/)?(%s)>~", implode("|",$allowed_tags));
$with_allowed = preg_replace($regex, "<\\1\\2>", $sans_tags);
echo $with_allowed;
echo "\n";
Результат:
guax@trantor:~$ php teste.php
<html><b>test</b><strong>teste</strong></html>
Интересно, есть ли решение для замены всего сразу.Но это работает.