web-dev-qa-db-ja.com

PHPでファイル名の文字列またはパターンでディレクトリ内のすべてのファイルを検索します

ファイル名が特定のパターンに一致するPHPを使用して、ディレクトリ(再帰的または非再帰的)のファイルを一覧表示しようとしています。私は正規表現があまり上手でなかったので、あなたが提供できるどんな援助も素晴らしいでしょう。返されたファイル名のリテラルチェックを検索することはできましたが、それはそれほど素晴らしいアイデアではないと思います:)

更新+最終的なソリューション:1/18/2011 @ 20:06 PM

正規表現をもう少し理解したら、探していた方法を実行する別の方法を見つけました。私が正規表現を使っていたところに完全に不満を感じていたとしても、オンラインガイドで見つけたよりも簡単な言葉でこれをいくつか説明するために友人を連れて行ってくれたおかげで、今では少しそれがわかります。

このソリューションは基本的に、「prefixone」または「prefixtwo」のいずれかのプレフィックスが付いた特定の画像をチェックすると同時に、それが特定のタイプ(jpg、jpeg、png)の画像であり、次の形式のいずれかに一致することも確認します。

Wordpress(これを使用していた場所)から渡されたスラッグに応じて、その正規表現と一致します。以下はリストの例です。

prefixone.123-abc._tag1.001.jpg
prefixone.345-xyz._tag1.002.jpeg
prefixtwo.123-abc._tag2._tag1.003.jpg
prefixone.123-abc._tag2.004.jpeg
prefixtwo.345-xyz._tag2._tag3._tag1.005.jpg
prefixtwo.123-abc._tag1.001.jpg
prefixone.345-xyz._tag1.001.png
prefixtwo.456-rst._tag1.001.png

Opendir()関数からファイルリストに返される可能性のあるこれらのファイルはすべて、スラッグが一致した場合、これらのファイルはすべて一致した可能性があります。ファイル名のタグ付け情報の順序に関係なく。

これが正規表現で苦労している別のユーザーを助けることを願っています。こつこつを取得するのは面倒ですが、いくつかの基本的なことを理解すると、残りの部分が急速に動き始め、独自のものを構築し始めます。

コード:

<?php
// create an array to hold directory list
$results = array();

// create a handler for the directory
$directory = $_SERVER['DOCUMENT_ROOT'].'/some/path/to/images/';
$handler = opendir($directory);

// open directory and walk through the filenames
while ($file = readdir($handler)) {

    // if file isn't this directory or its parent, add it to the results
    if ($file != "." && $file != "..") {

        // check with regex that the file format is what we're expecting and not something else
        if(preg_match('#^(prefixone|prefixtwo)[^\s]*\.'.$wordpress-slug.'\.[^\s]+(\.(jpg|jpeg|png))#', $file)) {

            // add to our file array for later use
            $results[] = $file;
        }
    }
}
?>

私は実際にこれを再帰的にする必要はありませんでしたが、オンラインには再帰的な例がたくさんあり、心配することはほとんどありませんでした。パターンによるコンテンツの分離がこのタスクの中心であったため、上記のコードで十分です。

補足:

昨日「受け入れられたコメント」を指摘した人々には、私はそれを逃しているとは思っていなかったので謝罪します。私は悪い日を過ごしていました。コメントについて誰かに急いでいたようでしたら申し訳ありません。これは素晴らしいコミュニティであり、私ができる場所も提供できることを嬉しく思います。

20
Will Ashworth

globを使用して、パターンに一致するパス名を検索する またはGlobIteratorを使用します。

再帰的にする必要がある場合 RegexIteratorRecursiveDirectoryIteratorを使用してください。

質問は確かに重複しており、検索機能を使用すると上記のすべての例を簡単に見つけることができるため、このCWをマークします。そうしてください。

15
Gordon