Если вы возвращаете результаты и , отображающие их, то не должны ли вы иметь доступ к необработанным данным до того, как они появятся в html? Если это так, то внесите изменения в необработанные данные, добавив туда теги span.
Если вы говорите, что ваши необработанные данные могут уже содержать html, вы можете использовать регулярное выражение, чтобы определить, находитесь ли вы внутри html-тега, и использовать preg_replace вместо str_replace.
Другие опции:
- загрузить результаты в синтаксический анализатор dom и выполнять операции замены только на конечных текстовых узлах
- напишите свой собственный анализатор, чтобы отслеживать, если вы находитесь внутри HTML-тега или нет
- вытащить все HTML-теги из ваших результатов, поместить в качестве заполнителей, как
«[[[tag1]]] balha blah blah [[[tag2]]]», затем замените оставшийся текст, а затем замените ваши теги обратно в