Выделение хештегов из текста
С помощью уже упоминавшегося класса IntlBreakIterator можно легко выделить из текста хеш-теги. Для этого создадим итератор не по предложениям, а по словам с помощью: createWordInstance. Итерация с помощью IntlBreakIterator выдаёт смещения границ слов, что в данном случае не очень удобно. Поэтому воспользуемся методом IntlBreakIterator::getPartsIterator. Он создаёт ещё один итератор, который возвращает уже непосредственно сами слова. Далее, когда встретится символ # (он в режиме WordInstance считается отдельным словом), запоминаем этот факт и следующее слово обрабатываем как хеш-тег.
Вот пример кода:
Проверка mb_strlen($item)>1 нужна для отработки случаев вида #! #;,так как в этом случае знаки препинания рассматриваются как отдельные слова. Кроме того, хештеги из одной буквы обычно не имеют смысла.
Вот пример кода:
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 нужна для отработки случаев вида #! #;,так как в этом случае знаки препинания рассматриваются как отдельные слова. Кроме того, хештеги из одной буквы обычно не имеют смысла.