PHP – Улучшение функции капитализации текста

У меня есть функция, которая использует строку:

function capitalize_sentence($text) { $output = preg_replace_callback('/([.!?])\s*(\w)/', function ($matches) { return strtoupper($matches[1] . ' ' . $matches[2]); }, ucfirst(strtolower($text))); return $output; } 

Когда у меня есть простая строка:

 $text = 'hello. this works !'; var_dump($text); $text = capitalize_sentence($text); var_dump($text);die; 

это работает хорошо:

 string 'hello.this works !' (length=18) string 'Hello. This works !' (length=19) 

Но в моем коде иногда строка выглядит так (с некоторыми тегами):

 $text = '<span>hello.</span> this <b>works</b> !'; var_dump($text); $text = capitalize_sentence($text); var_dump($text);die; 

Что дает мне это (как вы можете видеть, первые слова не капитализируются …):

 string '<span>hello.</span> this <b>works</b> !' (length=39) string '<span>hello.</span> this <b>works</b> !' (length=39) 

Как улучшить мой код? Мне нужно «убежать» <tags> не удалять их, но заглавные буквы первого слова, как в первом примере ….

Мне нужен вывод следующим образом:

 string '<span>Hello.</span> This <b>works</b> !' (length=39) 

Спасибо !