ハッシュタグの正規表現

2019.1.3 (木)

これは案外難しい。ちょっと考えただけでは駄目でした。
例にある通りだと以下のようになり、英数字のハッシュタグは所定のアンカーリンクに変換できます。

$test = preg_replace("/(?<![0-9a-zA-Z'\"#@=:;])#(\w*[a-zA-Z_])/u",
 "<a href=\"http://search.twitter.com/search?q=\\1\">#\\1</a>", $test);

これに数字と日本語を加えると

$textarea = preg_replace("/(?<![0-9a-zA-Z'\"#@=:;])#(\w*[a-zA-Z_0-9ぁ-んァ-ヶ\x{3005}\x{3007}\x{303b}\x{3400}-\x{9FFF}\x{F900}-\x{FAFF}\x{20000}-\x{2FFFF}])/u",
       "<a href=\"http://search.twitter.com/search?q=\\1\">#\\1</a>", $textarea);

古い情報で[一-龠々]が日本語で扱う漢字の範囲とする正規表現がありますがこれだと漢字のアップデートに対応できなさそうです。諸事情でutf8の漢字は中国・韓国・日本が混ぜこぜになっているので日本人からみるとその範囲指定がやたらと煩雑になっています。上記の例では日本語の全角として使われる数学や音楽の記号などは含まれていません。


ハッシュタグをリンクに置き換える正規表現例
phpで漢字の正規表現を調べる(utf-8)