Я работал над этим некоторое время. Комментарии и удивительно эффективное решение Таха Паксу помогли мне разобраться в проблеме. Решение Таха Паксу чисто изолировало слова, за исключением случаев, когда речь шла об акцентированных буквах. Похоже, поиск в Google подсказывает, что RegEx не так дружелюбен с не-ascii символами.
Именно тогда, когда я бросил пытаться делать регулярные выражения вуду (любой, кто может, я глубоко уважаю), я придумал этот не очень элегантный хак.
$text = "Testing text. Café is spelled true. And pokémon too... ‘bad quotes’. (brackets)... Löwen, Bären, Vögel und Käfer sind Tiere. That’s what I said.";
$text = str_replace(array('’',"'"), '000AP000', $text);
$text = str_replace("-", '000HY000', $text);
$text = preg_replace("/[^[:alnum:][:space:]]/u", ' ', $text);
$text = str_replace('000AP000', "'", $text);
$text = str_replace('000HY000', "-", $text);
$text = str_replace(array("' ",'- ',' '," '",' -',' '), ' ', $text);
$words = mb_split( ' +', $text );
Он использует две статистически маловероятные строки в качестве заполнителей, очищает остальные, отбрасывает дефисы и апострофы, а затем удаляет все, что касается пробелов (и нескольких пробелов). Это работает для всего, что я могу найти, чтобы бросить на это.
Я бы хотел найти менее смелое решение, если смогу, но мои навыки регулярных выражений могут не соответствовать задаче (даже с открытым шпаргалкой).