質問: [180701-0800][log]hoge.txt > > $file3_rep =[180701-0800][log]hoge2.txt > > > こういった様式に変更したいと考えております。同一のファイル名で.exec.logと.txtがディレクトリに共存している状態です。 Linux上のマウント位置から見える該当のディレクトリ > > /nas/data/02-user-doc/180801/ > > /nas/data/01-admin-doc/ > > > までのパスを削除し末端の > > .exec.log > > > を.txtに置き換える状態で悩んでおります。 正規表現等を使えばできるのかご教示いただければ幸いです。
回答: やりたいことがちょっとわからないのですが 1非公開なディレクトリをPHPを使って公開したいのか 2ファイルをコピーする為のpath変換処理がほしいのか で異なります 1の場合 linux側でln -sでシンボリックリンクを作り公開する方法。 →シンボリックリンクをたどれる用にする設定が必要でまたファイル名の置換は出来ません。 readfile関数を使い目的のpathをPHPが読み取りそれをそのまま送信する方法。 →ファイル名はそのままですが、 `header('Content-type: text/plain;');` とすれば拡張子によらずブラウザ上でテキスト表示されます。 hoge.php?=ファイル名などファイル名ではなくphp名とパラメータで制御することになります。 ファイル名で扱いたい場合.htaccessにmod_rewriteなどで工夫する必要があります。 などがあります。 2の場合(たぶんこちらだと思います) pathinfo関数やexplodeを使い拡張子とファイル名を分解することができますので拡張子だけの置換であればこちらの関数を使い機械的に置換すべきでしょう。 ``` $filelist[] = '/nas/data/02-user-doc/180801/[180801-0800][log]test.exec.log'; $filelist[] = '/nas/data/01-user-doc/180801/[180701-0800][log]hoge.exec.log'; $filelist[] = '/nas/data/01-admin-doc/180801/[180701-0800][log]hoge2.exec.log'; $file_rep = array(); foreach($filelist as $filename){ $pathinfo = pathinfo($filename); $explodefile = explode('.', $pathinfo['basename']); unset($explodefile[count($explodefile)-1]); unset($explodefile[count($explodefile)-1]); $file_rep[] = implode('.', $explodefile) . '.txt'; } var_dump($file_rep); ``` 正規表現は検証が困難なのでより複雑な場合に限定したほうが良いと思いますが `[180801-0800][log]test.exec.log` を `[180801-0800][log]test.txt` に変換したいだけの正規表現であれば以下の通りです。 ``` preg_replace('/^(.*)\.exec\.log$/u','$1.text','[180701-0800][log]hoge2.exec.log'); ```