PHPの正規表現で特定の拡張子を持つファイルを抽出する方法

このQ&Aのポイント
  • PHPの正規表現を使用して、特定の拡張子を持つファイルを抽出する方法について教えてください。
  • 具体的には、あるディレクトリから拡張子が「zip」のファイルのみを抽出したいです。
  • 現在のソースコードではうまくいかないため、正規表現のパターンを教えてください。
回答を見る
  • ベストアンサー

ファイル名のパターンに一致させる正規表現

言語はPHPです。 あるディレクトリに拡張子が「zip」のファイルと「php」のファイルが混在しています。 ファイル名は以下のようなパターンだとします。 cat01.zip dog01.zip cat02.zip dog02.zip index.php このディレクトリの中から、ファイル名が「cat」で始まりかつ拡張子が「zip」のファイルのみを抜き出す正規表現を考えてみたのですが、どうしてもうまくいきません。 現在のソースは以下です。これを実行するとファイルが全く取得されません。 $files = new RegexIterator($files, '/^cat.+\.zip$/i', RecursiveRegexIterator::MATCH); 以下のソースなら、拡張子が「zip」のファイルをすべて取得することができました。 $files = new RegexIterator($files, '/^.+\.zip$/i', RecursiveRegexIterator::MATCH);

noname#236289
noname#236289

質問者が選んだベストアンサー

  • ベストアンサー
  • hwoa1024
  • ベストアンサー率36% (122/336)
回答No.2

先の回答者と同じく私のところでも結果は表示されています。 ただこの場合、cat.zipは取得できないようです。 $files= new RegexIterator($files, '/^cat.*\.zip$/i', RecursiveRegexIterator::MATCH); こちらだとcat.zipの場合でも取得できます。

その他の回答 (1)

  • t_ohta
  • ベストアンサー率38% (5085/13291)
回答No.1

私の手元では問題なく動作しますよ。 どこかに記述ミスがありませんか? ========== $files = new ArrayIterator(array( "cat01.zip", "dog01.zip", "cat02.zip", "dog02.zip", "index.php", )); $files = new RegexIterator($files, '/^cat.+\.zip$/i', RecursiveRegexIterator::MATCH); print_r(iterator_to_array($files)); ========== Array ( [0] => cat01.zip [2] => cat02.zip ) ==========

関連するQ&A

  • PHP 正規表現 スラッシュの扱いについて

    PHPでファイルをアップロードするプログラムを作っています。 誤ってCGIなどのプログラムをアップしない為に、 拡張子を判断してそれを防ぐ為の構造を考えています。 そこで条件部を、 if(!preg_match("/^image\/.*(png|jpeg|gif)$/i", $_FILES["file"]["type"]) || !preg_match("/^text/html\/.*(txt|html)$/i", $_FILES["file"]["type"])){ エラーメッセージ } としたのですが、上手く動いてくれません。 恐らく「text/html」の表記に問題があるのだと思うのですが… 解決方法、教えてください。よろしくお願いします。

    • 締切済み
    • PHP
  • ファイル名を取得できない

    次のようなソースでディレクトリ内のファイル名を取得しようとしています。 $dh=opendir("."); while(($entry=readdir($dh))){ if(is_file($entry)){ print $entry."<>"; } } closedir($dh); このソースを、取得したいディレクトリ内で動かすとまったく問題ないのですが、ディレクトリのパスを1個上の階層などから相対パスで指定すると、.phpファイルと.htmlファイルは取得するのですが、ほかのファイル名は取得されなくなってしまいます。 何かphp.iniなどで設定があるのでしょうか。 回避方法がありましたら是非ご教授ください。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 正規表現の質問

    お世話になります。 PHPでの正規表現に関する質問です。 使っている教本の中に、次のようなコードがあります。 $files = new FilesystemIterator('.'); $files = new RegexIterator($files, '/\.(?:txt|csv)$/i'); foreach ($files as $file) { echo $file->getRealPath() . '<br>'; } これは、スクリプトと同じフォルダーにあるファイルの中で、.txt と .csv の拡張子のついたものだけを選択して表示するために、正規表現を使っているのですが、この中の ?: という部分の意味が分かりません。いろいろと正規表現に関する記事をネットで調べてみましたが、: コロンをメタ文字として扱っているものは見たことがありません。この ?: の役割を教えてください。お願いします。 ちなみに、これを取り去ってもちゃんと期待通りの結果が出ます。

    • ベストアンサー
    • PHP
  • フォルダ内のファイル名を取得、エラーになる原因は?

    指定したフォルダ内のファイル名を1つずつ取得するサンプルコードです。 function ForlderInImgGet() { CR = String.fromCharCode(13); folder = new Folder ("../img/"); files = folder.getFiles(); for (i=0; i<files.length; i++) { txt = txt + files[i].fullName + CR; } alert(txt); } 実行すると「Folder is not defined」というエラーになってしまいます。 画像ファイルは、 ルートディレクトリ\test\img\に01.jpg~10.jpgがあります。 jsファイルは、 ルートディレクトリ\test\js\に配置してあります。 一体なぜこのようなエラーが出てしまうのでしょうか。

  • ファイル管理ツールを作りたいのですが

    ファイル管理ツールを作る際に、ディレクトリ内のファイル名を取得し、それをアプレット画面のテキストエリアに表示させたいのですが全くやり方がわかりません。 初心者なりに頑張って作ってみたのですが、 import java.io.File; public class Filekanri{ public static void main(String args[]){ File dir = new File("C:\\MyDir"); File[] files = dir.listFiles(); // 全ファイルの名前を取得 String fnames[] = new String[files.length]; for( int i = 0; i < files.length; i++ ) { fnames[i] = files[i].getName(); } これで良いのでしょうか?このあとどうすれば良いのかどうかどうか教えてください。宜しくお願いします。

  • 正規表現について

    php5を使って正規表現を勉強中です。 1度の正規表現で、拡張子を除いた ファイル名だけ抜き出すにはどうしたらよいでしょうか。 例えば、以下のような文字列から、…以降のファイル名を抜き出したいです。 /var/www/html/index.html  …indexを抜き出したい /var/www/html/login/login.php …loginを抜き出したい /var/www/html/js/script.js …scriptを抜き出したい

    • 締切済み
    • PHP
  • PHP パスからファイル名を抽出する正規表現

    いつもお世話になっております。 画像をアップロードするスクリプトを考えているのですが… (PHP+MySQL) 画像格納ディレクトリを用意し、MySQLにてファイル名・拡張子・投稿時間を管理するといったものです。ここで、 1.半角英数以外のファイル名だと、アップロードすることはできるが表示ができない。 2.なので、半角英数以外のファイル名の場合にはエラー表示を出すようにする。 少々強引ですが、現段階で自分にできることをやろうと思っていますので、上のような仕組みを考えています。 引っかかったのが、 $file_name=$_FILES['user_picture']['name']; (user_pictureはPOSTからの値) の半角英数の判別です。 これで得られるクライアントサイドのフルパスからファイル名だけを抽出して、その部分にpreg_matchを当てればいいと思うのですが、その方法が分かりません。 どなたかご教授いただけないでしょうか。 よろしくお願い致します。 (抽象的な方向性ではなく、具体的なアドバイス・スクリプトをお願いします。) (そもそもなんで1.ができないのかご存知の方がいらっしゃいましたら、こちらもお願いします。)

    • ベストアンサー
    • PHP
  • ファイルのアップロードが出来ない

    送信フォームを使って画像をアップロードさせたいのですが、うまくいきません。ブラウザ上でエラー表示は出ないのですが、移動させたいディレクトリにファイルが入って来ない状況です。 初心者なので、参考書を片手に例文をカスタマイズしていったので、アルゴリズム自体がどこか間違っているかもしれないです。 特に下記ソースコード中の 『$path = getcwd();~』 の辺りで、スクリプトのあるディレクトリパスを取得して、パスの末尾に"¥"or"/"を追加しているのは理解出来るのですが、 そもそも何のスクリプトのパスを取得しているのかが解らず、 結局テンポラリディレクトリからの移動先ディレクトリを自分で$new_dirと定義してmove_uploaded_file()しています。 どなたか詳しい方いらっしゃいましたらご教示宜しくお願いします! ===========ソースコード=============== <?php if (isset($_POST["submit"])) { //------------------------------------------------------------------------- //■クライアントから取得する元ファイル名を$pic_name、 //■テンポラリディレクトリ名を$pic_tmp //■テンポラリディレクトリからの移動先ディレクトリを$new_dir //------------------------------------------------------------------------- $pic_name = $_FILES["pic"]["name"]; $pic_tmp = $_FILES["pic"]["tmp_name"]; $new_dir = "http://xxx.com/pic/"; //---------------------------------------------------------------------------------- //■エラーメッセージは配列に追加 //---------------------------------------------------------------------------------- $error_message = array(); $path = getcwd(); if (isset($_ENV["OS"]) && preg_match("/window/i", $_ENV["OS"])) { $path .= "\\"; } else { $path .= "/"; } if (strlen($pic_name)>0 && strlen($pic_tmp)>0) { //---------------------------------------------------------------------------------- //■テンポラリディレクトリにファイルがアップされているかチェック //---------------------------------------------------------------------------------- if (is_uploaded_file($pic_tmp)) { //---------------------------------------------------------------------------------- //■ファイルを移動 //---------------------------------------------------------------------------------- if (!move_uploaded_file($pic_tmp, $new_dir .basename($pic_name))) { $error_message[] = "●自画像ファイルのアップロードに失敗しました"; } } } } ?> <html> <form method="post" action="<?=$SERVER["PHP_SELF"]?>" enctype="multipart/form-data" > 画像のアップロードフォーム <input type="hidden" name="MAX_FILE_SIZE" value="100000"> <input type="file" name="pic" size="40"> </html>

    • ベストアンサー
    • PHP
  • 【PHP】関数から渡した引数を正規表現で扱うには?

    下記(1)はディレクトリ「sample_dir」のファイル一覧を取得し、ファイル名「hogehoge」から始まるものだけを一覧表示させたものです。 「hogehoge」以外の文言でも絞り込めるように関数を呼び出して((2))、指定文言を引数で$xに渡したいのですが、引数が認識されません。 引数を正規表現で扱うには、どのように記述したら良いですか。 ご教示をお願いします。 ---------------------------------------- (1) ---------------------------------------- //対象ディレクトリ $dir_s="./sample_dir"; //ディレクトリ内のファイルを取り出す $filelist=scandir($dir_s); //ファイル数をチェック $count=count($filelist); for($i=0; $i<$count; $i++){ $y = ($filelist[$i]); if(preg_match("/^hogehoge/", $y)){ print_r($y); } } ---------------------------------------- (2) ---------------------------------------- function file_search($x){ for($i=0; $i<$count; $i++){ $y = ($filelist[$i]); if($z = preg_match($x, $y)){ print_r($y); } } } file_search("/^filename/"); //引数「filename」でマッチさせたい

    • ベストアンサー
    • PHP
  • 【PHP】ファイル名を取得して拡張子変更で実行

    sample.phpというphpファイル内で、同ディレクトリにあるsample.txtを読みこませたいのですが、上手くいきません。 <?php $bn = basename($_SERVER['PHP_SELF'], ".php"); ?> で$bnに、sampleという名前を取得させるところまではできましたが <?php require($bn.txt); ?> という式では上手くいかないのです…。 <a href="<?php print $bn ?>.txt">リンク名</a>は成功したので、おしいところまで行ってるのではないかと思うのですが。 ファイル名を取得して任意の拡張子をくっつけて実行するような数式がありましたら教えてください。よろしくお願いします。

専門家に質問してみよう