環境
$ php -v
PHP 8.3.8 (cli) (built: Jun 4 2024 14:53:17) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.3.8, Copyright (c) Zend Technologies
with Zend OPcache v8.3.8, Copyright (c), by Zend Technologies
$ php artisan --version
Laravel Framework 11.10.0
困ったこと
趣味で開発しているアプリでハッシュタグを扱いたい!となり、文章から正規表現でハッシュタグを抽出する処理を実装するにあたりたくさんのサイトを参考にさせていただきました。
例えばこんな感じ。
$value = '#思い出 この本は図書館で大人気でした。 #ウォーリーを探せ ';
$matches = [];
preg_match_all(
'/(?<=\s|^)#\S+/',
$value,
$matches
);
logger($matches[0]);
#思い出
、#ウォーリーを探せ
の2つが抽出されるのを期待しましたが、結果は以下の通り。
local.DEBUG: array (
0 => '#思い出 この本は図書館で大人気でした。 #ウォーリーを探せ ',
)
あれれ〜??
そう、この文章には全角スペースが入っていたのでした。
'#思い出★この本は図書館で大人気でした。★#ウォーリーを探せ★'
★ ... 全角スペース
どうも全角スペースは空白文字として認識されないようです。
対応方法
u
をつけます。
$value = '#思い出 この本は図書館で大人気でした。 #ウォーリーを探せ ';
$matches = [];
preg_match_all(
'/(?<=\s|^)#\S+/u', // ←ここ
$value,
$matches
);
logger($matches[0]);
local.DEBUG: array (
0 => '#思い出',
1 => '#ウォーリーを探せ',
)
これで万事OKだわ。
参考
余談
今回の対応にあたりいろいろと調べていたところ、「ハッシュタグとは半角スペースで区切られるものなので全角スペースが間にあってもそれは1つのタグとして扱うのだ」という宗派があることを知りました。
私は気持ち悪いので全角・半角問わずスペースがあったら区切りたい派です。
全角スペース許容派の方は敢えてu
オプションを外すのもありかもしれませんね。