2010-06-17 2 views
20

Je veux récupérer tous les hashtags d'un tweet en utilisant une fonction PHP.Récupérer tous les hashtags d'un tweet dans une fonction PHP

Je sais que quelqu'un a posé une question similaire here, mais il n'y a aucun indice sur la manière de l'implémenter en PHP. Comme je ne suis pas très familier avec les expressions régulières, je ne sais pas comment écrire une fonction qui retourne un tableau de tous les hashtags dans un tweet.

Alors, comment ce que je fais, en utilisant l'expression régulière suivante:

#\S*\w 

Répondre

31
$tweet = "this has a #hashtag a #badhash-tag and a #goodhash_tag"; 

preg_match_all("/(#\w+)/", $tweet, $matches); 

var_dump($matches); 

* sont Dashes caractères illégaux pour hashtags, underscores sont autorisés.

+0

fonctionne très bien, merci! – snorpey

+1

Notez que '' '$ matches''' donne un tableau de taille 2. Les deux éléments ont les mêmes chaînes. En outre pas unicode pris en charge. – trante

+0

Cette expression est l'une des meilleures que j'ai trouvées. – henrywright

4

Essayez cette expression régulière:

/#[^\s]*/i 

Son exécution PHP ressemblerait à ceci:

preg_match_all('/#[^\s]*/i', $tweet_string, $result); 

Le résultat est un tableau contenant tous les hashtags dans le Tweet (enregistré comme "$ result" - le troisième argument).

Enfin, consultez ce site. Je l'ai trouvé très pratique pour tester des expressions régulières. http://regex.larsolavtorvik.com/

EDIT: J'ai essayé votre expression régulière et cela a très bien fonctionné!

4

Utilisez la fonction preg_match_all():

function get_hashtags($tweet) 
{ 
    $matches = array(); 
    preg_match_all('/#\S*\w/i', $tweet, $matches); 
    return $matches[0]; 
} 
27

J'ai créé ma propre solution. Il fait:

  • recherche tous les hashtags dans une chaîne
  • Supprime les doublons
  • Trie hashtags concernant à compter de l'existence dans le texte
  • Prend en charge les caractères unicode

    function getHashtags($string) { 
        $hashtags= FALSE; 
        preg_match_all("/(#\w+)/u", $string, $matches); 
        if ($matches) { 
         $hashtagsArray = array_count_values($matches[0]); 
         $hashtags = array_keys($hashtagsArray); 
        } 
        return $hashtags; 
    } 
    

La sortie est comme ceci:

(
    [0] => #_ƒOllOw_ 
    [1] => #FF 
    [2] => #neslitükendi 
    [3] => #F_0_L_L_O_W_ 
    [4] => #takipedeğerdost 
    [5] => #GönüldenTakipleşiyorum 
) 
+1

+1 pour cela une très bonne solution à la question, merci. –

+0

@trante Cela fonctionne-t-il encore? Le tableau retourné est vide pour moi. Comment la chaîne doit-elle ressembler ou être codée? – Tom

+0

Cela ne fonctionne pas avec certains caractères Unicode. par exemple. en thaï # รองเท้า obtiendra seulement # รอง เท La voyelle de la langue thaïlandaise non inclus. utilisez la méthode @minaz ci-dessous travaillé! – supersuphot

11

Ne pas oublier les hashtags qui contiennent des valeurs numériques unicode, et souligne:

$tweet = "Valid hashtags include: #hashtag #NYC2016 #NYC_2016 #gøypålandet!"; 

preg_match_all('/#([\p{Pc}\p{N}\p{L}\p{Mn}]+)/u', $tweet, $matches); 

print_r($matches); 

\ p {Pc} - pour correspondre à souligner

\ p {N} - caractère numérique dans un script

\ p {L} - lettre de toute langue

\ p {Mn} - tout espace de marquage non (accents, trémas, etc)

Questions connexes