2010-06-17 17 views
20

Bir PHP işlevini kullanarak bir tweet'den tüm hashtag'leri almak istiyorum.Bir PHP işlevinde bir tweet'den tüm hashtag'leri alma

Birinin benzer bir soru sorduğunu biliyorum here, ancak PHP'de bunu tam olarak nasıl uygulayacağınız konusunda bir ipucu yoktur. Düzenli ifadelere aşina olmadığımdan, bir tweet'de tüm hashtag'leri bir dizi döndüren bir işlevi nasıl yazacağımı bilmiyorum.

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

: PHP gibi görünecektir onu Running

/#[^\s]*/i 

:

#\S*\w 

cevap

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

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

var_dump($matches); 

* Kısa çizgiler hashtag için yasadışı karakter vardır, alt izin verilir.

+0

çalışıyor, teşekkürler! – snorpey

+1

'' '$ match''', 2 boyutlu bir dizi verdiğine dikkat edin. Her iki öğenin de aynı dizeleri var. Ayrıca unicode desteklenmiyor. – trante

+0

Bu ifade, bulduğum en iyilerinden biridir. – henrywright

4

bu normal ifade deneyin: Bunu yapacağım, şu normal ifadeyi kullanarak nasıl Yani

Sonuç, Tweet'deki tüm hashtagleri içeren bir dizidir ("$ result" olarak kaydedilmiştir - üçüncü argüman).

Son olarak, bu siteye göz atın. Düzenli ifadeleri test etmek için gerçekten kullanışlı buldum. http://regex.larsolavtorvik.com/

EDIT: Düzenli ifadenizi denedim ve harika çalıştı!

4

Kullanım preg_match_all() fonksiyonu:

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

Kendi çözümüm oluşturdum. Bu yapar:

  • yinelenen olanları metin
  • içinde varlığını saymak ilgili

  • sıralar Hashtag'leri kaldırır Dizgedeki tüm Hashtag'leri bulur destekler unicode karakterleri

    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; 
    } 
    

Çıktı şunun gibidir:

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

+1 bu soruya gerçekten güzel bir çözüm, teşekkür ederim. –

+0

@trante Bu hala çalışıyor mu? Döndürülmüş dizi benim için boş. Dize nasıl görünmeli veya kodlanmalı? – Tom

+0

Bu, bazı unicode karakterlerle çalışmaz. Örneğin. Thai # รองเท้า sadece # รอง เท alacaksınız Tay dili ünlü dahil değildir. Aşağıdaki @minaz yöntemini kullanın çalıştı! – supersuphot

11

altını: p {Pc} \

$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); 

- maç

altını çizmek \ p {N} - herhangi bir karakterdeki sayısal karakter

p {L} \ - p {Mn} \ herhangi bir dilde

gelen mektupta - Herhangi olmayan boşluk işaretleme (aksan, umlaut, vb)

İlgili konular