先日、Twitterのつぶやきでよく見られる、#(ハッシュタグ)に関する記事を書きました。
PHPのpreg_replace関数と正規表現を使って、ハッシュタグがあるキーワードに対してリンクをはっていくわけですが、以前記述したコードでは必ずしも上手くいかないことが分かりました。
2つ以上のハッシュタグに対応できない
ハッシュタグが続くと、1つ目のハッシュタグに対してリンクがつかないことが分かります。その時のコードは、下記の通りです。
[php]
$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’]);
[/php]
ちなみにこのつぶやきで使われている、”#溢れ出る癒しの空気”と、”#かわいいと思ったらRT”のキーワードの間には、半角スペース1文字分が入っています。
では、2つ以上のハッシュタグがある場合は、どのように正規表現を使えばいいのか?
2つ以上のハッシュタグに対応するための正規表現
いろいろググってみて、こちらのページにのっている正規表現を参考にさせていただきました。おかげさまで2つのハッシュタグにリンクをつけることができました。
引用させていただいたいたサイトでは、preg_match_all関数が使われています。自分が使っている、preg_replace関数に置き換えて表現するとこんな感じになります。
[php]
$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’]);
[/php]
正規表現における”?:^”とは
2つ以上のハッシュタグがあっても、リンクを付けられるのは、おそらく1つ目の小かっこの後にある、“?:^”にコツがあると思われます。
正規表現サンプル集で確認すると、”?:”は「パターンのグループ」という表現になっていますが、それが”^”(行頭)と合わせているところがよく分かりません。すいませんすいません(汗
とりあえず、Twitter APIのつぶやき中にある、2つ以上のハッシュタグに対してリンクをつけたい場合は、今回引用させていただいたコードを参考にしてください。
〔参考サイト〕