substituir todas as tags html, exceto certas, por htmlspecialchars () no PHP?

Gostaria de processar minha entrada de usuário para permitir apenas determinadas tags html e substituir as outras por suas entidades html, bem como substituir caracteres não-tag. Por exemplo, se eu quisesse apenas permitir que o<b> e a<a> tag, então

allow_only("This is <b>bold</b> and this is <i>italic</i>.
            Moreover 2<3 and <a href='google.com'>this is a link</a>.","<b><a>");

deve produzir

This is <b>bold</b> and this is &lt;i&gt;italic&lt;/i&gt;.
Moreover 2&lt;3 and <a href='google.com'>this is a link</a>.

Como posso fazer isso em PHP? Estou cientestrip_tags() que poderetirar as tags indesejadas completamente e estou ciente dehtmlspecialchars() que pode substituirtodas as tags por suas entidades html, mas nenhuma onde apenas tags específicas são substituídas. Como isso pode ser feito em PHP?

E se não houver uma maneira 'comum' de fazer isso, como devo, em geral, processar a entrada do usuário que pode ter um html regular válido, mas também pode ter< sinais e código html potencialmente perigoso?

questionAnswers(1)

yourAnswerToTheQuestion