Достаточно долго в моих проектах разбиение на слова делалось очень простой регуляркой:
preg_match_all("|([A-Za-zА-Яа-я0-9]+)|u", $str, $words);
Всё бы хорошо, но понадобилось сделать проект для азербайджанского языка, а там куча букв расширенной латиницы. Поискав немного, нашёл специальный элемент, соответствующий любой букве utf8
preg_match_all('/([\pL0-9]+)/u', $str, $words);