Мне как-то удалось получить желаемый результат.Если кто-то наткнется на этот вопрос, это код, который я реализовал.
$text = 'INPUT STRING WHERE TO <strong>FIND</strong> MATCHES';
$phrases = ['STRING','FIND'];
foreach ($phrases as $phrase) {
$splitByTags = preg_split('/(<.*?>)/', $text, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
$pureText = array_filter($splitByTags, function($item, $key) use ($splitByTags){
return (
stripos($item, '<') === false &&
(isset($splitByTags[$key - 1]) && stripos($splitByTags[$key - 1], '<a') === false)//need to filter out strings who have preceding anchor tag
);
}, ARRAY_FILTER_USE_BOTH);
$tagElements = array_diff_key($splitByTags, $pureText);
foreach($pureText as &$element) {
$link = '<a href="{$href}" title="{$title}" target="{$target}">{$phrase}</a>';
$element = str_replace($phrase, $link, $element);
}
$aText = $pureText + $tagElements;
ksort($aText);
$text = implode('', $aText);
}