Функция `str_replace()` может вести себя странно при замене в HTML из-за различных причин, таких как неправильные параметры, неправильно сформированный HTML код или некорректное использование функции. Для правильной работы функции `str_replace()` в HTML коде необходимо учитывать специфику HTML разметки и правильно указывать параметры замены.
Что касается функции `preg_replace_callback()`, которая должна заменить пробелы в ссылках в HTML коде, но приводит к некорректному результату, добавляя лишний текст, это может быть вызвано некорректным регулярным выражением или неправильным обращением к группам в коллбэке. Чтобы исправить ошибку, нужно убедиться, что регулярное выражение корректное и соответствует формату ссылок в HTML коде, а также правильно обращаться к группам внутри коллбэка.
Вот пример корректного решения:
```php
$html = '<a href="http://example.com/lorem ipsum dolor sit amet">Link</a>';
$result = preg_replace_callback('/href="([^"]+)"/', function($matches) {
return 'href="' . str_replace(' ', '%20', $matches[1]) . '"';
}, $html);
echo $result;
```
Этот пример заменяет все пробелы внутри значения атрибута href на %20 в HTML коде.