Как получить хэштеги UTF-8 без специальных символов в PHP

У меня проблема с извлечением только букв UTF-8, таких как ä,ö,ü,ß (скажем, букв, которые используются в словах), без символов, таких как !"§$%&/()+' и т. д.

  function getHashtags($string)
{
    $string = html_entity_decode($string, ENT_QUOTES, "utf-8");
    preg_match_all('/(\#)([^\s]+)/u', $string, $matches);
    if ($matches) {
        $hashtagsArray = array_count_values($matches[0]);
        $hashtags = array_keys($hashtagsArray);
        $hashtagLine = '';
        foreach ($hashtags as $hashs) {
            $hashs = strtolower(trim($hashs));
            $hashtagLine .= $hashs;
        }
    }
    return $hashtagLine;
}

это мое текущее решение, оно получает строковый текст, извлекает из него хэштеги и возвращает их в строке. Проблема в том, что с этим решением хэштеги также обрабатываются как #example!"$/% (и не обрезаются непосредственно перед ! как #example).

Есть ли у кого-нибудь подход (Regex) для извлечения твиттера, такого как хэштеги UTF-8, без этих нежелательных знаков пунктуации из строки в PHP?


person tobysas    schedule 20.04.2015    source источник
comment
А как насчет "/(?<=^|\\P{L})#\\b\\p{L}+\\b/u"? regex101.com/r/qP5oI9/3   -  person Wiktor Stribiżew    schedule 20.04.2015
comment
Итак, какие именно символы разрешены и какие запрещены? Специальные символы не имеют значения. Вы имеете в виду буквы и знаки препинания? Или что-то другое?   -  person deceze♦    schedule 20.04.2015


Ответы (2)


Используйте свойство юникода:

preg_match_all('/#(\p{L}+)/u', $string, $matches);

\p{L} обозначает любую букву на любом языке.

person Toto    schedule 20.04.2015
comment
Если вы следуете соглашению Twitter, хэштег может включать подчеркивание и не начинаться с цифры. /(?<=^|\P{L})(#\b\p{L}[\p{L}\d_]+)/u работает хорошо. - person S.Walker; 18.10.2016

вы можете использовать регулярное выражение ниже

$regex = "(?:#)([\p{L}\p{N}_](?:(?:[\p{L}\p{N}_]|(?:\.(?!\.))){0,28}(?:[\p{L}\p{N}_]))?)";

он работает аналогично хэштегам Facebook и Instagram.

суть в github: https://gist.github.com/khanzadimahdi/2ecfe1ba38860db132b4543ab5126926

и протестируйте его, используя ссылки ниже:

https://regexr.com/4suqt

https://regex101.com/r/4SAxik/1

https://www.regexpal.com/?fam=113956

person Mahdi    schedule 26.01.2020