$text = preg_replace(array('/(\W)(\w{1,2})\040/', '/^(\w{1,2})\040/', '/\040(\w{1,2})(\W)/', '/\040(\w{1,2})$/'), array('$1', ' ', '$2', ' '), $text);
, gdzie patterny wyłapują odpowiednio:
- (2) słowo na początku ciągu,
- (4) słowo na końcu ciągu,
- (1 i 3) słowa w środu
W sumie zamiast \040 (spacja) powinno być \s (wszystkie białe znaki).
@up:
gargamel - twój regex nie sprawdzi się przy słowach na początku lub końcu ciągu. I z tego co kojarzę, to polegnie też w przypadku kilku słów obok siebie np. 'aa bb cc dd ee'