Зачем использовать регулярные выражения?Почему бы не использовать htmlspecialchars()
?
echo htmlspecialchars($str, ENT_NOQUOTES, 'UTF-8', false);
Обратите внимание на четвертый параметр.Он говорит, что ничего не кодировать дважды.Таким образом, в основном это превратит все <
в <
, все >
в >
и все &
, которые не являются частью существующей сущности, в &
Но, если вынеобходимо использовать регулярное выражение, вы могли бы сделать:
$regex = '/&([^\w;])/';
echo preg_replace($regex, '&\1', $str);
По сути, он сохраняет несловарный символ, а затем добавляет его обратно ...