Выделение хештегов из текста

С помощью уже упоминавшегося класса IntlBreakIterator можно легко выделить из текста хеш-теги. Для этого создадим итератор не по предложениям, а по словам с помощью: createWordInstance. Итерация с помощью IntlBreakIterator выдаёт смещения границ слов, что в данном случае не очень удобно. Поэтому воспользуемся методом IntlBreakIterator::getPartsIterator. Он создаёт ещё один итератор, который возвращает уже непосредственно сами слова. Далее, когда встретится символ # (он в режиме WordInstance считается отдельным словом), запоминаем этот факт и следующее слово обрабатываем как хеш-тег.

Вот пример кода:
function getHashTags($text) { $breaker =IntlBreakIterator::createWordInstance('ru_RU'); $breaker->setText($text); $iterator = $breaker->getPartsIterator(); $hashtags = array(); $mode = false; // теперь в $item будут сами слова, а не их смещения foreach ($iterator as $item) { // выставляем $mode в TRUE, если следующее слово нужно обработать как хеш-тег if ($item==='#') $mode=true; elseif ($mode && trim($item) && mb_strlen($item)>1) { // ряд дополнительных проверок, чтобы в хеш-теги не попадал мусор $hashtags[] = mb_strtolower($item); // обработка закочена, поэтому сбрасываем $mode до тех пор, пока не попадётся новый символ # $mode = false; } else $mode=false; } return $hashtags; }
Проверка mb_strlen($item)>1 нужна для отработки случаев вида #! #;,так как в этом случае знаки препинания рассматриваются как отдельные слова. Кроме того, хештеги из одной буквы обычно не имеют смысла.