Если кто, как и я, наткнётся на этот вопрос в поиске, я решил эту проблему. Вот как я заменил дефисы на неразрывные дефисы
function processingText($text) {
if (preg_match("/\<.*\>/u", $text)) {
// До первого тега
$text = preg_replace_callback("|^([^\<]*)\<|u", function ($matches) {
return str_replace('-', '‑', $matches[1]).'<';
}, $text);
// Основная часть
$text = preg_replace_callback("|\>([^\<]*)\<|u", function ($matches) {
return '>'.str_replace('-', '‑', $matches[1]).'<';
}, $text);
// После последнего тега
$text = preg_replace_callback("|\>([^\<]*)$|u", function ($matches) {
return '>'.str_replace('-', '‑', $matches[1]);
}, $text);
return $text;
} else {
// Замена в тексте без тегов
return str_replace('-', '‑', $text);
}
}
Ограничение: предполагается, что '<' и '>' используются только в паре.