文字列の日付から数字を取り出したかった話。
2021/06/29(火) 06:07
↑このような日付がありこれをdatetime型の
2021-06-29 06:07:00
という形で保存したかった。
phpにはpreg_match()という関数があり
正規表現とやらで欲しい値を取得できるらしい。
ちなみに僕は正規表現というのに激しく拒絶反応があった。だって書いてること意味わかんねーもん…謎記号たくさん出てくるし。
とにかくやってみた
preg_match('/^[0-9]{4}/', $datas['date'], $year);
まずはこんな感じ。とりあえず年を取得したい。第一引数の'/^[0-9]{4}/'は検索条件、第二引数の $datas['date']は検索したい文字列'2021/06/29(火) 06:07'が入っている。第三引数を指定するとそこの変数に検索結果を配列で返してくれる。
結果はこんな感じ
array:1 [▼
0 => "2021"
]
正規表現の始まりと終わりは/である必要があり、^は文頭を示し、[0-9]は数字、{4}は4回続くことを示す。つまり/^[0-9]{4}/で文頭から始まる4つ続く数字を検索しているので2021の4桁の数字が出てくる。
もっとステップアップしてみよう次は年月日まで
preg_match('/^([0-9]{4})\/([0-9]{2})\/([0-9]{2})/', $datas['date'], $date);
array:4 [▼
0 => "2021/06/29"
1 => "2021"
2 => "06"
3 => "29"
]
正規表現の始まりと終わりは/(スラッシュ)である必要があるが検索対象に/があるとエスケープする必要がある。/の場合は/と\(バックスラッシュ)を前につけることでエスケープできる。
また([0-9]{4})と()が出てきたがこうすることで()内の検索結果を個別に配列で返してくれるようになる。
その場合[0]は検索対象全体、[1]以降で()内に合った検索対象が入っている。
最後に時間も含めて検索してみよう。
preg_match('/^([0-9]{4})\/([0-9]{2})\/([0-9]{2}).*([0-9]{2}):([0-9]{2})/', $datas['date'], $datetime);
array:6 [▼
0 => "2021/06/29(火) 06:07"
1 => "2021"
2 => "06"
3 => "29"
4 => "06"
5 => "07"
]
うおおおおおおおおお!!!!!!!
ちな.*が新しく登場したがこれは文字列を表す。早い話あいだを補完してくれてる。
後はこれを文字列連結すれば・・・
$datetime=$datetime[1]."-".$datetime[2]."-".$datetime[3]." ".$datetime[4].":".$datetime[5].":"."00";
2021-06-29 06:07:00
これでdatetime型で格納できる。
完
なれの問題なのかもしれないがやってみたら面白かった。ちなみに正規表現を試すのに便利なサイトを見つけたので張っておきます。
http://okumocchi.jp/php/re.php