【PHP】関数から渡した引数を正規表現で扱うには?

このQ&Aのポイント
  • 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
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

とりあえずpreg系の基本だけ理解した方がいいでしょう ・検索文字はデリミタで囲う http://www.php.net/manual/ja/regexp.reference.delimiters.php ・予約語との競合をさけるため変数でパターンを渡すときにはpreg_quote()でエスケープする http://www.php.net/manual/ja/function.preg-quote.php 当然処理するためのメタ文字はクォートしてはいけません <?PHP $delimiter="/"; $pattern=$delimiter."^".preg_quote($x).$delimiter; preg_match($pattern, $y);

faio5468ss
質問者

お礼

メタ文字をクォートしてしまっていたのがミスだったようです。 デリミタの囲い方など、解りやすくご説明いただきありがとうございました。

その他の回答 (2)

  • t_ohta
  • ベストアンサー率38% (5080/13275)
回答No.2

function file_search($x) の定義で、関数内で使用する $count や $filelist が渡されていないので正常に動作しないのではないでしょうか。

faio5468ss
質問者

お礼

メタ文字指定の記述が間違っておりました。ありがとうございました。

noname#244856
noname#244856
回答No.1

PHP Manual - glob http://www.php.net/manual/ja/function.glob.php この関数では不十分ですか?

faio5468ss
質問者

お礼

一発で結果が得られました。 ありがとうございます!

関連する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
  • preg_match関数で正規表現の複数指定方法。

    ./aaaディレクトリ内においてファイル名に、『bbbb』及び『cccc』と言う文字列が含まれるファイルを./eeeディレクトリに移動させるスクリプトを考えております。 以下は『bbbb』のみを拾うようなスクリプトです。 ========= <?PHP if ($dir = opendir("./aaa")) { while (($file = readdir($dir)) !== false) { if(preg_match("/bbbb/",$file)) rename("./aaa/".$file,"./eee/".$file); } closedir($dir); } ?> ========= 上記は前にこちらで質問させていただき、正常に動くことを確認しております。 今回は『bbbb』及び『cccc』が含まれる場合に./eeeディレクトリに移動させることを考えております。 このような場合は『cccc』はどのよう記載すればよいのでしょうか?ご教授の程よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPのopendir関数って・・・。

    <?php $dir = "/etc/php5/"; // 既知のディレクトリをオープンし、その内容を読み込みます。 if (is_dir($dir)) { if ($dh = opendir($dir)) { while (($file = readdir($dh)) !== false) { echo "filename: $file : filetype: " . filetype($dir . $file) . "\n"; } closedir($dh); } } ?> 上の例の出力は、たとえば以下のようになります。 filename: . : filetype: dir filename: .. : filetype: dir filename: apache : filetype: dir filename: cgi : filetype: dir filename: cli : filetype: dir とありますが、 filename: . : filetype: dir filename: .. : filetype: dir は何もフォルダになくても出ますよね? これは何ですか??

    • ベストアンサー
    • PHP
  • ファイルコピー

    「ルートディレクトリ内の全てのファイルの中でファイル名に"1111"及び"2222"と言う文字列が含まれるファイルを./333/444ディレクトリに同じファイル名が無ければコピーする」 というスクリプト(下記qqq.php)を作りましたが、 「ルートディレクトリ内の全てのファイルの中でファイル名に"1111"及び"2222"と言う文字列が含まれるファイルの中で最もファイル更新時刻が新しいものだけを./333/444ディレクトリに同じファイル名が無ければコピーする」 と変えたいのですがどうも上手くいきません。 この『・・・文字列が含まれるファイルの中で最もファイル更新時刻が新しいものだけを・・・』の部分につきまして、ご教授ください。 スクリプトを記載していただけるととても助かります。 どうか宜しくお願いいたします。 ********************* qqq.php <?PHP if ($dir = opendir("./")) { while (($file = readdir($dir)) !== false) { if(preg_match("/1111/",$file)) { if(preg_match("/2222/",$file)) { $to="./333/444/".$file; if(!file_exists($to)) copy("./".$file,$to); } } } closedir($dir); } ?>

    • ベストアンサー
    • PHP
  • 条件分岐~同じファイル名がある場合は実行せず

    下記スクリプトにてカレントディレクトリにaaaaおよびbbbbという文字列が存在するファイルを./ccc/dddディレクトリに移行するということを行っています。 下記スクリプトでコピーの処理がありますが、 同じファイル名が./ccc/dddディレクトリに存在する場合、そのファイルについてのみコピーを行わないようにするスクリプトを考えております(同じファイルを何度も./ccc/dddディレクトリにコピーするという事を無くしたいため)。 どなたかお分かりでしたらご教授ください。 実際にスクリプトに追加していただけると助かります。 php4.3.2です。 ======== <?PHP if ($dir = opendir("./")) { while (($file = readdir($dir)) !== false) { if(preg_match("/aaaa/",$file)) { if(preg_match("/bbbb/",$file)) { copy("./".$file,"./ccc/ddd/".$file); } } } closedir($dir); } ?> ========

    • ベストアンサー
    • PHP
  • 最新のファイルのみ検索

    サーバー内のファイルを検索するのにKentWebさんのwwwsrch.cgiを利用しています。 # # すべてのファイルをなめ回す # sub search1 { local($dir) = $_[0]; local(@filelist, $file, $filename); opendir(DIR, $dir); @filelist = readdir(DIR); closedir(DIR); foreach $file (@filelist) { if ($file eq ".") { next; } if ($file eq "..") { next; } $filename = "$dir/$file"; if (-d $filename) { if ($recursive_flag) { &search1($filename); } } else { &search2($filename, $dir); } } } # # ファイルの中身を検索する # # 指定していない拡張子のファイルは無視する $suffix = ".html .cgi .pl"; $fname = substr($target, rindex($target, ".")); if ($suffix{$fname} != 1) { return; } ↑の条件に30日以上古いファイルを無視するように改造することはできないでしょうか? 検索対象ファイルが数十万以上と莫大に増加してきたため、最新のファイルのみ検索対象にできればと考えております。

    • ベストアンサー
    • Perl
  • 日付をすべて2桁(07/02、 06/30)にしたい

    a.html内にある日付のデーターを取ってきて日付をすべて2桁(もし 7/2 ならば 07/02 、6/30 ならば 06/30)にしたいのですが、なかなかうまくいきません。 自分で作ったプログラムa.phpでは最初の日付しか2桁になりませんでした。 -------------a.html--------------- <>06/25、7/2<>13:00~13:55<>あああああ<> <>06/25、8/2<>19:00~20:00<>いいいいい<> <>6/27<>19:00~21:48<>ううううううう<> <>06/27、7/3、7/4、7/12<>19:58~20:54<>ええええええええ<> <>7/1<>13:54~17:00<>おおおおおおお<> --------------a.php---------------- <? $filename = "a.html"; $filedata = @file($filename); $filedata = @join("",$filedata); preg_match_all('/(<>(.*?)<>.*<>.*<>)/',$filedata, $match); for($i=0;$i<count($match[0]);$i++){ $match[2][$i] = explode("、", $match[2][$i]); //////////この辺がうまくできない/////// for($m=0;$m<count($match[2][$i]);$m++){ $match[2][$i][$m] = explode("/", $match[2][$i][$m]); $match[2][$i][$m][0] = sprintf("%02d", $match[2][$i][$m][0]); $match[2][$i][$m][1] = sprintf("%02d", $match[2][$i][$m][1]); $match[2][$i][$m] = $match[2][$i][$m][0]."/".$match[2][$i][$m][1]; $match[2][$i] = join("、",$match[2][$i]); } print $match[2][$i]."<br>";//←最後はこの形で表示できるようにしてもらいたいです// } ?> どなたか教えてください。m(_ _)m よろしくお願いします。

    • ベストアンサー
    • PHP
  • 携帯、スマートフォンのPHP振り分け

    こんなPHPを書いているのですが どうしてもParse errorが出ます。 解決方法を教えて下さい!! ■エラー内容 Parse error: syntax error, unexpected T_EXIT in /home/sites/heteml/users/web/m/index.php on line 5 ■振り分けPHP <?php $agent = $_SERVER['HTTP_USER_AGENT']; if(preg_match("/^DoCoMo/i", $agent)){ header("Location: ​http://www.hogehoge.com/m/i/index.html");​ exit; }else if(preg_match("/^(J\-PHONE|Vodafone|MOT\-[CV]|SoftBank)/i", $agent)){ header("Location: ​www.hogehoge.com/m/s/index.html");​ exit; }else if(preg_match("/^KDDI\-/i", $agent) || preg_match("/UP\.Browser/i", $agent)){ header("Location: ​www.hogehoge.com/m/e/index.html");​ exit(); }else if(preg_match("iPhoneやスマートフォン用の判定", $agent)){ header("Location: www.hogehoge.com/m/smt/index.html"); exit(); }else{ header("Location: ​www.hogehoge.com/m/pc/index.html");​ exit(); } ?> よろしくお願い致します。

    • ベストアンサー
    • PHP
  • コマンドライン引数で正規表現を指定したい

    Perlでgrep -Aのようなことがしたいです。 ---------------grep.pl------------------------------- use strict; use warnings; #コマンドライン引数の確認 if(@ARGV != 3){ die "USAGE: \0 [num] [regex] [file]"; } #数字の読み込み my $num = $ARGV[0]; #正規表現の読み込み my $regex = qr/$ARGV[1]/; #ファイル名の読み込み my $file = $ARGV[2]; #該当行を保存する配列 my @lines = (); open my $fh, '<', "$file" or die "$!"; my @file = <$fh>; close $fh; for(my $i=0; $i<@file; $i++){ if($file[$i] =~ /$regex/){ push @lines, $file[$i]; for(my $j=1; $j<=$num; $j++){ if($i+$j < @file){ if($file[$i+$j] !~ /$regex/){ push @lines, $file[$i+$j]; }else{ last; } }else{ last; } } } } foreach my $item (@lines){ print $item; } ------------------------------------------------- ところが、正規表現がうまく読み込めません。 perl grep.pl 2 \d{4}\/\d{2}\d{2} test.txt などとしても、\d{4}\/\d{2}\d{2}の部分が機能しません。 コマンドライン引数から正規表現を指定するにはどうしたらよいでしょうか。

    • ベストアンサー
    • Perl
  • Perlをphpに変換しているのですが

    $y=~m|^\Q$x\E,| を preg_match("|^\Q$x\E,|",$y) に置き換えても動きません 正規表現の\Qと\Eが無効のようです \Qと\Eについてpreg_match用のものは有るのでしょうか?

    • ベストアンサー
    • Perl

専門家に質問してみよう