【正規表現,jQuery,PHP】twitterハッシュタグを抽出する

最終更新: 2014-12-15
説明を簡潔にするため、JavaScriptのみを例に挙げます。

なお、現在はTwitter本家から正式なライブラリが公開されているので、そちらを参考にするのがいいと思います。
https://github.com/twitter/twitter-text

以下は、私が勝手に作り上げた非公式な抽出方法です。

日本語ハッシュタグを抽出する正規表現

見やすくするために改行とタブを入れています。
おおまかに説明すると、タグとして使える文字というものがあり、それがハッシュの直前に存在していないかを調べています。
また、ハッシュタグの直後に別のハッシュタグが接していないかどうかを否定先読みで調べています。

/
(?:^|[^0-9A-Za-z_〃々ぁ-ゖ゛-ゞァ-ヺーヽヾ一-龥0-9A-Za-zヲ-゚]+)
[##]
(
[0-9A-Za-z_〃々ぁ-ゖ゛-ゞァ-ヺーヽヾ一-龥0-9A-Za-zヲ-゚]*
[A-Za-z〃々ぁ-ゖ゛-ゞァ-ヺーヽヾ一-龥A-Za-zヲ-゚]+
[0-9A-Za-z_〃々ぁ-ゖ゛-ゞァ-ヺーヽヾ一-龥0-9A-Za-zヲ-゚]*
)
(?![##0-9A-Za-z_〃々ぁ-ゖ゛-ゞァ-ヺーヽヾ一-龥0-9A-Za-zヲ-゚]+)
/

サンプル

ハッシュとして使える文字
  • #(半角ハッシュ)
  • #(全角ハッシュ)
♯(楽譜記号のシャープ)は使えません。

ハッシュの直前に使ってはいけない文字
  • タグとして使える文字

タグとして使える文字
  • 全角・半角の英数字
  • 全角・半角の片仮名
  • 平仮名
  • 日本の漢字
  • いくつかの記号 (後述)
アンダースコアと数字のみの文字列はタグとして認められません。

文字クラスの意味
Unicodeの公式サイトのコード表をもとに調べました。

公式: http://www.unicode.org/charts/

文字クラス対象の文字公式のコード表(pdf)
0-9A-Za-z半角英数ASCII Characters
〃々ノノ字点、同の字点CJK Symbols and Punctuation
ぁ-ゖ平仮名Hiragana
゛-ゞ濁点、半濁点、平仮名繰返し記号、平仮名繰返し記号(濁点)Hiragana
ァ-ヺ全角片仮名Katakana
ーヽヾ長音、片仮名繰返し記号、片仮名繰返し記号(濁点)Katakana
一-龥日本の漢字CJK Unified Ideographs (Han)
(容量注意: 30MB)
0-9A-Za-z全角英数Halfwidth Katakana
ヲ-゚半角片仮名Halfwidth Katakana

全言語のハッシュタグを抽出する文字クラス

Twitterのソースを覗き見たら、それらしい正規表現がありました。
URLで渡されたハッシュタグが正しい形式なのかを検査するためのもののようです。
その一部を抜き出します。

// 引用: https://twitter.com/ソースコード

[a-z0-9_À-ÖØ-öø-ÿĀ-ɏɓ-ɔɖ-ɗəɛɣɨɯɲʉʋʻ̀-ͯḀ-ỿЀ-ӿԀ-ԧⷠ-ⷿꙀ-֑ꚟ-ֿׁ-ׂׄ-ׇׅא-תװ-״﬒-ﬨשׁ-זּטּ-לּמּנּ-סּףּ-פּצּ-ﭏؐ-ؚؠ-ٟٮ-ۓە-ۜ۞-۪ۨ-ۯۺ-ۼۿݐ-ݿࢠࢢ-ࢬࣤ-ࣾﭐ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻﹰ-ﹴﹶ-ﻼ‌ก-ฺเ-๎ᄀ-ᇿ㄰-ㆅꥠ-꥿가-힯ힰ-퟿ᄀ-ᅵァ-ヺー-ヾヲ-゚ー0-9A-Za-zぁ-ゖ゙-ゞ㐀-䶿一-鿿꜀-뜿띀-렟-蟖〃々〻]

実際の使用

文字クラスを分解して、構造を明確にするのがいいと思います。

var hash = '##';
var tag = 'A-Za-z〃々ぁ-ゖ゛-ゞァ-ヺーヽヾ一-龥A-Za-zヲ-゚';
// var tag = 'a-zÀ-ÖØ-öø-ÿĀ-ɏɓ-ɔɖ-ɗəɛɣɨɯɲʉʋʻ̀-ͯḀ-ỿЀ-ӿԀ-ԧⷠ-ⷿꙀ-֑ꚟ-ֿׁ-ׂׄ-ׇׅא-תװ-״﬒-ﬨשׁ-זּטּ-לּמּנּ-סּףּ-פּצּ-ﭏؐ-ؚؠ-ٟٮ-ۓە-ۜ۞-۪ۨ-ۯۺ-ۼۿݐ-ݿࢠࢢ-ࢬࣤ-ࣾﭐ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻﹰ-ﹴﹶ-ﻼ‌ก-ฺเ-๎ᄀ-ᇿ㄰-ㆅꥠ-꥿가-힯ힰ-퟿ᄀ-ᅵァ-ヺー-ヾヲ-゚ーA-Za-zぁ-ゖ゙-ゞ㐀-䶿一-鿿꜀-뜿띀-렟-蟖〃々〻'; // 全言語対応
var digit = '0-90-9';
var underscore = '_';

var pattern = new RegExp(
'(?:^|[^' + tag + digit + underscore + ']+)' +
'[' + hash + ']' +
'(' +
'[' + tag + digit + underscore + ']*' +
'[' + tag + ']+' +
'[' + tag + digit + underscore + ']*' +
')' +
'(?![' + hash + tag + digit + underscore + ']+)',
'g');

注意点
抽出したハッシュタグは、カナは全角に、英数字は半角に直すこと。

Twitterでは入力の際は半角カナや全角英数を認めていますが、内部ではそれぞれ適切に変換しているようです。
たとえば、『#バスケ(半角)』をTwitterで検索すると、『#バスケ(全角)』の結果が表示されます。

https://twitter.com/search?q=%23バスケ