2014-07-26 85 views
2

我可以從一個主題標籤如何過濾字符串以提取符號後的文本?

function gethashtags($text) 
     { 
      //Match the hashtags 
      preg_match_all('/(^|[^a-z0-9_])#([a-z0-9_]+)/i', $text, $matchedHashtags); 
      $hashtag = ''; 
      // For each hashtag, strip all characters but alpha numeric 
      if(!empty($matchedHashtags[0])) { 
       foreach($matchedHashtags[0] as $match) { 
        $hashtag .= preg_replace("/[^a-z0-9]+/i", "", $match).','; 
       } 
      } 
      //to remove last comma in a string 
     return rtrim($hashtag, ','); 
     } 

所以在我的後處理文件過濾文本函數,變量使用gethashtags()來提取文本,但只有在字符串中有一個#。 #是觸發器。

我需要的是一個類似的函數,但使用@作爲觸發器而不是散列。

什麼函數可以實現這個結果?我不明白正則表達式的絲毫沒有,所以我很抱歉,如果這個問題出現模糊,因爲我已盡最大努力解釋我的問題。

感謝先進!

+0

輸入和預期輸出會更好。 –

+0

輸入是一種可以輸入任何內容的形式。例如,輸入可能是「大家好」,所以函數會忽略這個,但輸入也可以是「@Callum Hello!#hashtag」,所以函數必須提取兩段文本(Callum和Hashtag),以便它們可以存儲到數據庫 –

+0

你的意思是這個http://regex101.com/r/gD2oI8/1 –

回答

1

我將簡化你的函數是這樣的:

function gethashtags($text) { 
    preg_match_all('/\B[@#]\K\w+/', $text, $matches); 
    return implode(',', $matches[0]); 
} 
echo gethashtags("@Callum Hello! #hashtag @another #hashtag"); 

說明

  • 您正則表達式的(^|[^a-z0-9_])部分就像一個非單詞邊界\B
  • 然後我們匹配@#字符。 \K丟掉它與之匹配的所有內容。
  • 然後,我們簡單地匹配任何一個字符後面的單詞字符,然後簡單地結果。

輸出

Callum,hashtag,another,hashtag 
+0

喜歡這個!非常感謝! –

+0

@CallumAtwal很高興能幫到你。 – hwnd

1

我建議/([@#][^@^#]\S*)/g獲取所有@ ..和#..

http://regex101.com/r/gD2oI8/2

隨着$sMatch{0}您可以檢查@或# 或者移動「(」後面的「[]」跳過它:-)