【正規表現,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で検索すると、『#バスケ(全角)』の結果が表示されます。