[PHP] 拡張子とファイル名を抜き出す正規表現でハマった話

2020年1月18日

PHP テクノロジー プログラミング

ズブのペチパー(phper)ですが、プログラム言語は何でも大好きな、ユゲタです。 ここ数年、PHPはこき下ろされていて、異言語プログラマー交流会などで形見が狭い思いをしているようですが、 インターネット初期に、perlしかcgiの選択肢が無い(初心者webエンジニアにとって)時代に登場したphpの便利さを覚えているので、今でも非常にPHPという言語は枯れて見えていないのですが、pythonやrubyやnodeなど、サーバーサイドで使えるインタプリタ言語が広まってきて、それぞれを良いとする派閥が生まれたようです。 どの言語でも使えば、便利に使えるし、WEBサイト構築をする時に出来ないという状態はないので、あとは「本人の好き嫌い」だけの間隔なのだが、自分の使っている言語以外を悪く言うエンジニアがたまにいて、非常にその集まりの空気が悪くなる事を何度か経験したことがあります。 なんか宗教のようですね・・・ いろんな言語で同じ作業をしていると、どの言語が使いやすい、使いにくいという判定はできるんですが、意外と環境構築が簡単かめんどくさいかで判断している人は少ないようです。 PHPは、環境構築は簡単ではないんですが、最近のlinuxにデフォルトでインストされているpythonなどは、いい市民権を得られていますよね。 でも、WEBページを作るという単体作業において、非常に便利なphpは今後も無くならないし、PHPでバイナリ操作までやっている尊敬すべきヘビーエンジニアをこれからも応援したいと思います。 そんなphpの作業で、今回のブログ記事は、ファイルアップロードを行うシステムを作っていた時に、ファイル名から拡張子を抜き出したいと思って、正規表現を使って行ったら、不具合に見舞われたという体験談をしたいと思います。

簡易に書いた拡張子ぶっこ抜き正規表現

$filepath = "example/aaa/bbb/ccc.ddd.txt"; preg_match("/\.(.*?)$/" , $filepath , $match1); print_r($match1); > Array > ( > [0] =&gt; .ddd.txt > [1] =&gt; ddd.txt > ) わかりやすくダメダメ正規表現ですね。 .(ピリオド)を基準にその後ろを抜き出そうとしていますが、.(ピリオド)が2つ以上あると、先頭にマッチしてしまいます。 <?php $filepath = "example/aaa/bbb/ccc.ddd.txt"; preg_match("/\.(\w*?)$/" , $filepath , $match2); print_r($match2); > Array > ( > [0] => .txt > [1] => txt > ) こうすることで、無事に拡張子のみを抜き出すことができるようになりました。 \wは、英数字とアンダースコアのみにマッチする書き方です。 こうすることで、「.(ピリオド)」を除外した文字列のみにマッチできるため、拡張子の抜き出しには効果的です。 ・・・・あれ?????・・・ pathinfo使えばいいんじゃね?という声が聞こえてきたよ。 <?php $filepath = "example/aaa/bbb/ccc.ddd.txt"; print_r(pathinfo($filepath)); > Array > ( > [dirname] => example/aaa/bbb > [basename] => ccc.ddd.txt > [extension] => txt > [filename] => ccc.ddd > ) おいおい!、無駄な時間を費やしてんじゃね〜よオレ!!! でも、ネガティブに捉えてはいけない。 正規表現を少しだけ覚えられたじゃないか。 他の言語だともっとシンプルにできるんだろうな・・・

人気の投稿

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。

ブログ アーカイブ