| 13件目(121件中) |

Twitterのハッシュタグを正規表現で

固定リンク:#0000000120   投稿者:ZiSTA 日時:2010-09-07 22:39:22   コメント( 5

今回のミッション

Twitterのハッシュタグを抜き出す正規表現を書く。

ハッシュタグの仕様

Twitterの正式なハッシュタグの仕様は分かりませんでした。
試した限りでの仕様を考えてみました。

  • アルファベットと数字以外の後に「#」で始まる
  • アルファベットと数字とアンダーバーが使える
  • アルファベットまたはアンダーバーを必ず含む(数字のみは不可)

正規表現

PHPで使える正規表現で表すと以下のようになりました。

/(?<![A-Za-z0-9])#(\w*[_A-Za-z]\w*)/u


あるいは

/(?<![A-Za-z0-9])#(?=\w*[_A-Za-z])(\w+)/u

説明

「\w」は単語構成文字で[A-Za-z0-9_]と同じです。
「(?<![A-Za-z0-9])#」は戻り読み言明の否定形です。[A-Za-z0-9]以外の後ろに「#」がくる位置という意味で、アルファベットと数字以外に続く「#」にマッチします。具体的にはスペースや記号の後の「#」がマッチします。行頭の「#」もマッチします。
「#(?=\w*[_A-Za-z])」は先読み言明の肯定系です。「#」の後ろに「\w*[_A-Za-z]」が始まる位置という意味です。「#」の後ろに単語構成文字が0回以上あり、さらにその後ろにアルファベットかアンダーバーがある場合にそれらが始まる位置(#の直後)にマッチします。

蛇足

言明は複数の言明を組み合わせて同じ箇所をチェックするAND条件として使う事が出来るので便利です。

 

コメント

zista Twitterでは直前のアンド「&#abc」 はハッシュタグとして認識しないようです。
2010.09.22 14:37
sutara_lumpur この記事を読んで、PHPだけでなくJavaScriptでもハッシュタグ抽出の
正規表現が作れないかと試行錯誤しました。
結果は

/(?:^|[^\w]+)#(\w*[a-zA-Z_]\w*)/

です。
JavaScriptでは肯定先読みはできても、否定戻り読みは
できないので、前半部分を『(?:^|[^\w]+)』に変更しました。
よろしければZiSTAさんの意見を聞かせてください。

http://d.hatena.ne.jp/sutara_lumpur/20101012/1286860552
2010.10.12 14:41
zista sutara_lumpurさん、こんにちは。

書き込み頂いた正規表現ですが、#の前に「_(アンダーバー)」が使える点が不足しているなと思いました。
私ももう一度試してみました。すると以下の点が分かりました。
 1. #の前に「_(アンダーバー)」は使える
 2. #の前に「?」は使えない
 3. #の前の「&」は旧UIでは使えたが、新UIでは使えない。

新UIの場合:http://twingar.com/10003a
旧UIの場合:http://twingar.com/100039

Twitterの公式な情報が無いので試行錯誤で苦労しますよね。
2010.11.01 12:39
sutara_lumpur ハッシュタグ検出の検証の画像、拝見しました。
新・旧UIで判断が微妙に異なるとは…。
それにしても、他の記号と違って『?』や『&』が
#の直前に使えない理由とは何なのでしょうか(^ ^;)
英語文化圏ならではの事情があるのか、それとも気まぐれか…。

ともかく、『[^\w]』は『[A-Za-z0-9]』に変更します。
助言してくださってありがとうございましたm(_ _)m
2010.11.01 13:55
sutara_lumpur あ、書き間違えました。
『[^A-Za-z0-9&?]』でした(-_-;)
2010.11.01 14:01
| 13件目(121件中) |
↑ ページトップ