uchenik
1. Смысл этого всего - получить последовательность длинных слов, разделенных одиночными обычными пробелами. Поэтому и делается замена коротких слов, двойных пробелов, всяких табуляций и т.п. на обычные пробелы. Это бывает оправдано, хотя все зависит от трактовки задачи и особенностей реализации.
2. Мда... тут я чего-то намудрил и не досмотрел - после идущих подряд замен в моем варианте действительно оставались лишние пробелы. Спасибо за полезное замечание). Справедливости ради - твоя регулярка тоже оставляет множественные пробелы.
3. Имхо, а-яА-Яё с модификатором i как раз не имеет смысла - при правильно настроенной локали хватит и маленьких букв, а при неправильной в случае кодировки win1251 потеряешь большую букву Ё, а в общем случае вообще нет гарантии, что русские буквы идут подряд в кодовой таблице. А чтобы пропустить при замене короткие последовательности цифр, можно использовать что-нибудь вроде [^\s\d]{1,3}.
4. А ведь еще есть знаки препинания, которые тоже являются границей слова. Их, по идее, тоже надо вырезать...
Еще вариант с учетом замечаний и KIS-принципа:
PHP:
preg_replace('/(\s+|\b[^\d]{1,3}\b)+/sm', ' ', $text);