Обратные ссылки - ваш друг для такого рода вещей.
В регулярных выражениях допускается обратная ссылка, позволяющая вам сопоставить повторяющийся шаблон с в качестве первого.Например, давайте сопоставим ваши символьные сущности:
/(&#x[0-9a-f]+;)\1+/i
Это будет соответствовать первому обнаруженному им символьному объекту, затем перейдет к цепочке любого числа идентичных сущностей после него.
Если вы хотите удалить повторяющиеся символы, вы можете даже расширить его до следующего:
/(.+)\1+/i
, который будет соответствовать любой последовательности повторяющихся символов (включая пробелы) и составных шаблонов.Однако обратите внимание, что это избавит от повторяющихся букв в тексте, если они есть.