1. TOPTOP
  2. Webサービス
  3. Twitter

Twitterのつぶやきにある2つ以上の#(ハッシュタグ)にリンクをつけたいときの正規表現について

|

Twitter_logo_blue

先日、Twitterのつぶやきでよく見られる、#(ハッシュタグ)に関する記事(新しいタブで開く)を書きました。

PHPのpreg_replace関数と正規表現を使って、ハッシュタグがあるキーワードに対してリンクをはっていくわけですが、以前記述したコードでは必ずしも上手くいかないことが分かりました。

2つ以上のハッシュタグに対応できない

tweet_hash1

ハッシュタグが続くと、1つ目のハッシュタグに対してリンクがつかないことが分かります。その時のコードは、下記の通りです。

$tweet['text'] = preg_replace("/\s#(w*[一-龠_ぁ-ん_ァ-ヴーa-zA-Za-zA-Z0-9]+|[a-zA-Z0-9_]+|[a-zA-Z0-9_]w*)/u", " <a href=\"https://twitter.com/search/%23\\1\" target=\"twitter\">#\\1</a>", $tweet['text']);

ちなみにこのつぶやきで使われている、”#溢れ出る癒しの空気”と、”#かわいいと思ったらRT”のキーワードの間には、半角スペース1文字分が入っています。

では、2つ以上のハッシュタグがある場合は、どのように正規表現を使えばいいのか?

2つ以上のハッシュタグに対応するための正規表現

いろいろググってみて、こちらのページ(新しいタブで開く)にのっている正規表現を参考にさせていただきました。おかげさまで2つのハッシュタグにリンクをつけることができました。

tweet_hash2

引用させていただいたいたサイトでは、preg_match_all関数が使われています。自分が使っている、preg_replace関数に置き換えて表現するとこんな感じになります。

$tweet['text'] = preg_replace("/(?:^|[^ヲ-゚ー゛゜々ヾヽぁ-ヶ一-龠a-zA-Z0-9a-zA-Z0-9&_\/]+)[##]([ヲ-゚ー゛゜々ヾヽぁ-ヶ一-龠a-zA-Z0-9a-zA-Z0-9_]*[ヲ-゚ー゛゜々ヾヽぁ-ヶ一-龠a-zA-Z0-9a-zA-Z]+[ヲ-゚ー゛゜々ヾヽぁ-ヶ一-龠a-zA-Z0-9a-zA-Z0-9_]*)/u", " <a href=\"https://twitter.com/search/%23\\1\" target=\"twitter\">#\\1</a>", $tweet['text']);

正規表現における”?:^”とは

2つ以上のハッシュタグがあっても、リンクを付けられるのは、おそらく1つ目の小かっこの後にある、“?:^”にコツがあると思われます。

正規表現サンプル集(新しいタブで開く)で確認すると、”?:”は「パターンのグループ」という表現になっていますが、それが”^”(行頭)と合わせているところがよく分かりません。すいませんすいません(汗

とりあえず、Twitter APIのつぶやき中にある、2つ以上のハッシュタグに対してリンクをつけたい場合は、今回引用させていただいたコードを参考にしてください。

〔参考サイト〕