PHPのstr_replace()とreaddir()の使い方についての質問

このQ&Aのポイント
  • PHPのstr_replace()関数を使ってバックスラッシュをスラッシュに変換する際、一部が変換されず元のパスが一部消える現象が発生しています。この原因について質問します。
  • PHPのreaddir()関数を使ってディレクトリ内の要素を読み込み、ファイルかディレクトリかを判別するコードですが、正しく動作しません。ディレクトリをファイルとして表示してしまう問題について質問します。
  • お手数ですが、上記の質問内容を解決する方法についてアドバイスいただける方がいらっしゃれば、ご教示いただけますと幸いです。
回答を見る
  • ベストアンサー

PHP の2つの関数について

お世話になります。 ディレクトリー内の要素が、さらにディレクトリーなのかあるいはファイルなのかを検証する簡単なルーティンを作っていますが、この中で使っている2つの関数の働きが、自分が理解していたようにならないので質問させていただきます。 (1) str_replace() について ファイルエクスプローラーからpath としてコピーしてきたディレクトリーのパスは次のようになっています。 "C:\xampp\htdocs\PHP-practice\testDir" この中にあるバックスラッシュ "\" 記号を、str_replace() を使って "/" に変えようとしましたが、次のようになってしまいました。 $direct ="C:\xampp\htdocs\PHP-practice\testDir"; $direct = str_replace("\\", "/", $direct); echo "========== ".$direct."<BR>"; 結果は: ========== C: mpp/htdocs/PHP-practice estDir つまり中ほどにあるものは変換されましたが、最初と最後は変換されず、しかも元のパスの一部が消えています。これはどうしたことなのでしょうか?これが最初の質問です。 しかし実際にはここで止まっている訳にいかないので、手作業で修正して先に進めました。 (2)readdir() について ディレクトリーの中をreaddir()で読んで、それがディレクトリーかファイルかを区別する簡単なコードですが、上手く行きません。 出力結果は次のように、ディレクトリーをファイルであると表示してきます。 ========== C:/xampp/htdocs/PHP-practice/testDir insideDir-1 is a file insideDir-2 is a file video1.mp4 is a file readdir() か is_dir()のいずれかの使い方がおかしいのでしょうか? これが2番目の質問です。 実際には testDir フォルダーの中身は以下の通りです。 testDir >> insideDir-1 >> new1.php >>insideDir-2 >> songPath.txt >> video1.mp4 以下に全体のコードを書きます。 <?php function read_directory($direct){ $direct = str_replace("\\", "/", $direct); echo "========== ".$direct."<BR>"; $handle = opendir($direct); $entry = readdir($handle); $entry = readdir($handle);// skip . & .. while($entry = readdir($handle)){ if( is_dir($entry) ) { echo $entry." is a directory<BR>"; }else{ echo $entry." is a file<BR>"; } }// while closedir($handle); return; }// function // ================ main program ================ $dirname="C:/xampp/htdocs/PHP-practice/testDir"; //手作業修正済み read_directory($dirname); ?> どなたかよいアドバイスを頂ける方がいらっしゃいましたら、よろしくお願いいたします。

  • PHP
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • wormhole
  • ベストアンサー率28% (1621/5657)
回答No.1

(1) str_replace()の使い方の問題ではないです。 str_replace()する前の $direct を確認してみてください。 $direct ="C:\xampp\htdocs\PHP-practice\testDir"; echo "========== ".$direct."<BR>"; (2) id_dir()を使って、どこにある insideDir-1, insideDir-2, video1.mp4 がディレクトリかを調べようとされていますか? is_dir("insideDir-1") で調べられるのは(起動されるphpにとってのカレントディレクトリ)にある insideDir-1 ですよ。

papashiroSooke
質問者

お礼

早速にご回答を頂き、有難うございます。 質問(1)につきましては ご提案のように定義したパスの文字列をechoしたら、やはり同じように最初と最後の"\" が変換されず、文字も消えていました。 $direct ="C:\xampp\htdocs\PHP-practice\testDir"; echo "========== ".$direct."<BR>"; 結果:C: mpp\htdocs\PHP-practice estDir そこでおかしくなっていた2か所を"\\"に変えて次のようにしたら、期待通りに変換されました。 $direct ="C:\\xampp\htdocs\PHP-practice\\testDir"; echo "===== before ===== ".$direct."<BR>"; $direct = str_replace("\\", "/", $direct); echo "===== after ====== ".$direct."<BR>"; 結果は下のようになりました。  ===== before ===== C:\xampp\htdocs\PHP-practice\testDir ===== after ====== C:/xampp/htdocs/PHP-practice/testDir これはどう理解すればよいのでしょうか? 質問(2)の方ですが、"testDir" は、このプログラムと同じレベルの "C:\xampp\htdocs\PHP-practice\" に置いてあります。 wormhole さんが仰っていることは、is_dir() 関数で調べられるのはプログラムと同じレベルにある "testDir" がディレクトリーが否かだけであり、その中身については調べられないという事でしょうか?したがってそのディレクトリーからreaddir() で」抽出したディレクトリー名である "insideDir-1" や"insideDir-2" などについては調べないと。 そこで私は is_dir() を使う前に、その引数としてのディレクトリー名をフルパスにしてみました。これならPHPがどこで起動してもいけると思ったからです。 結果上手く行きました。以下に修正したコードを掲載します。 <?php function read_directory($direct){ $direct = str_replace("\\", "/", $direct); $handle = opendir($direct); $entry = readdir($handle); $entry = readdir($handle);// skip . & .. while($entry = readdir($handle)){ $fullentry = $direct."/".$entry; if( is_dir($fullentry)!== false ) { echo $fullentry." is a directory<BR>"; }else{ echo $fullentry." is a file<BR>"; } }// while closedir($handle); return; }// function // ================ main program ================ $dirname = "C:\\xampp\htdocs\PHP-practice\\testDir"; //echo $dirname."<BR>"; read_directory($dirname); ?> 結果は次の通りです。 C:/xampp/htdocs/PHP-practice/testDir/insideDir-1 is a directory C:/xampp/htdocs/PHP-practice/testDir/insideDir-2 is a directory C:/xampp/htdocs/PHP-practice/testDir/video1.mp4 is a file 今回は基本的なことを勘違いしていました。wormholeさんのご指摘で気が付きました。有難うございます。 質問(1)については、まだ疑問が残りますので、何かお考えがあればお聞かせください。

その他の回答 (1)

  • dell_OK
  • ベストアンサー率13% (740/5645)
回答No.2

1. 回答No.1さまのいわれるように置換前の文字列の書き方に問題があるようです。 PHPのサイトの文字列のリファレンスです。 https://www.php.net/manual/ja/language.types.string.php 引用符と二重引用符を読んでいただければわかると思います。 また、PHPはパスの区切り文字はスラッシュでもバックスラッシュ(円マーク)でもいいように見てくれると思いますので、置換しなくても大丈夫だと思います。 試してみましたが、どちらでもディレクトリ内の一覧を取得して、同じ動作をしてくれました。 もしこの実行ファイルがC:\xampp\htdocs\PHP-practice\testDirにあるのでしたら__DIR__を代用できます。 2. この現象はわかりません。 同じディレクトリとファイルを作ってみましたがディレクトリはディレクトリとして判定されました。

papashiroSooke
質問者

お礼

早速のご回答、有難うございます。 ご提案頂いたサイトの記事を読み、自分のパスの指定には2重引用符が使われていて、その結果 C:の後の"\x" や "\t" がエスケープされていたことがわかりました。 とても参考になりました。

関連するQ&A

  • PHPのprivate関数について

    PHPのアクセス修飾子privateについてお聞きします。 以下のようなコードを書いて実行したら、エラーメッセージが出ました。 code: <?php class Super { protected function protectedFunc(){ echo "original-Protected\n\r"; } private function privateFunc(){ echo "Private\n\r"; } public function publicFunc(){ privateFunc(); } } $super = new Super; $super->publicFunc(); ?> error message: Fatal error: Uncaught Error: Call to undefined function privateFunc() in C:\xampp\htdocs\HTML_practice\protected-practice.php:12 Stack trace: #0 C:\xampp\htdocs\HTML_practice\protected-practice.php(17): Super->publicFunc() #1 {main} thrown in C:\xampp\htdocs\HTML_practice\protected-practice.php on line 12 line12 というのは、public 関数であるpublicFunc() の内側で、private関数のprivateFunc() を使おうとした部分ですが、private関数はクラス定義の中だから使えるというのは間違った認識でしょうか? だとするとprivate関数はいつどんな時に使えるのでしょうか? どなたか例を挙げて説明頂けないでしょうか? 宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPです2つのスクリプトの相違がわかりません

    PHPですが、以下の2つのスクリプトで同じ結果がでると思ったのですが現実は違いました。 henkan.php <html> <body> <?php $uketori=$_POST['UKETORI']; $uketori=str_replace("pen","pencil", $uketori); $uketori=strtoupper($uketori); print "$uketori"; ?> </body> </html> henkan2.php <?php $str=$_POST['UKETORI']; echo str_replace("です。","だよん。", $str) . "<br>\n"; echo "<br>\n"; echo mb_ereg_replace("です。","だよん。", $str) . "<br>\n"; echo "<br>\n"; ?> フォームに です。 という文字を入れたら変換されて だよん。 と表示さしたいのですが、上の2つで相違がでました。なぜなんでしょうか。 henkan.php では変換されませんでした。 henkan2.php では変換されました。

    • ベストアンサー
    • PHP
  • 同一ディレクトリの連番ファイルの一番大きな数字のものをindex.phpに表示する

    お手上げで、困っています。 ご教教授いただければ幸いです。 現在、以下のような連番のファイルとindex.phpが1つのディレクトリに格納されている状態で、 この中から、数字の一番大きなものをphpで表示させたいのですが、 どうすれば良いか、ご教授お願い致します。 index.php 01.jpg 02.jpg 03.jpg 04.jpg 05.jpg 06.jpg 07.jpg 08.jpg 09.jpg 10.jpg . . . more 今の状態は、ディレクトリ内のファイルを見るまでです。 その先がお手上げ状態です。 <?php define("dirfile", "."); header("Content-Type: text/plain; charset=utf-8"); $handle = opendir(dirfile); while (($entry = readdir($handle))) { if(is_file(dirfile . "/" . $entry)) { echo $entry . "\n"; } } closedir($handle); ?> よろしくお願い致します。

    • ベストアンサー
    • PHP
  • xamppでPHPを実行

    PHP初心者です。 Xampp(バージョンは1.6.8)をインストールして、 PHPファイルを実行しようとすると、 「Fatal error: Undefined class name 'loggermanager'」 というエラーが出てしまいます。 libフォルダに「LoggerManager.php」は入っているのですが… 実行しようとしているファイルは C:\xampp\htdocs\ディレクトリ1\ディレクトリ2\ディレクトリ3\ディレクトリ4\ディレクトリ5 の配下にあり、「LoggerManager.php」は C:\xampp\htdocs\test\support_tool_pon\lib\log4php の配下にあります。 原因に心当たりがある方、教えてください。

    • ベストアンサー
    • PHP
  • PHPで使うis_null()関数

    PHP学習者です。 is_null() 関数の使い方で混乱しています。 添付の様な<form>を持つファイル nulltest.php と、それを受けて入力が nullかどうかを検証するファイルreceivee.php を作りました。 入力に何かを入れても、なにも入れなくてもis_null()は何も返しません、というか、False を返しているのだと思います。 逆に、!is_null() と否定形にすると、入力があっても無くても1,つまりtrue が返ります。 入力があれば true が返り、入力が無ければ false が返るようにするにはどうしたらよいのでしょうか?詳しい方どうか教えてください。 上記自作のファイルを以下にコピーします。 <?php echo "------------- nulltest.php ----------------</br>"; $no=null; echo "<form method='post' action='receive.php'>"; echo "<input type='text' name='testinput' value=".$no.">"; echo "<input type='submit' value='ok'>"; echo "</form>"; ?> <?php echo "------------- receive.php ------------------</br>"; $input=$_POST['testinput']; echo "======== ".$input." is ".is_null(input)."</br>"; ?>

    • ベストアンサー
    • PHP
  • phpでディレクトリが作れません

    php初心者です レンタルサーバで php.iniはいじれない環境です、 ディレクトリを作ろうとすると Warning: mkdir(testdir) [function.mkdir]: File exists in /home/xxxx/public/www/php/mkdir.php on line 14 とエラーが出ます <? $chk = mkdir("mydir"); $chkr = mkdir("mydir_r", 0777); // 読み込みのみを許可 if ($chk) { echo "mydir を作成しました。 <br>\n"; } if ($chkr) { echo "mydir_r を作成しました。<br>\n"; } ?> 間違ってますでしょうか ご指導願いたいです

    • 締切済み
    • PHP
  • PHPの画像表示パス

    お世話になります。 PHPでブラウザに画像を表示するときのパスについて質問させていただきます。 以下のようなコードで、画像のフルパスを使って画像を表示させようとしていますが、画像が表示されません。(添付スクリーンショットの左側)。 このコードの 第1行をコメントアウトして、第2行の相対パスでやると、画像がちゃんと表示されます。(右側) これはどうしてなのでしょうか?詳しい方がいらっしゃいましたら、よろしくご教授ください。 ちなみに、このファイル自体のパスは C:\xampp\htdocs\PHP7-solutions\new-test.php です。 <?php $selectedImage = "C://xampp/htdocs/php7-solutions/images/kinkakuji.jpg"; //$selectedImage = "images/kinkakuji.jpg"; if (file_exists($selectedImage) && is_readable($selectedImage)) { // && is_readable($selectedImage) $imageSize = getimagesize($selectedImage); echo "<pre>"; print_r($imageSize); echo "</pre>"; echo "<img src='".$selectedImage."' alt='kinkakuji temple' ".$imageSize[3].">"; }else { echo "no such file<BR>"; }

    • ベストアンサー
    • PHP
  • PHPでディレクトリ名のみ表示する方法が知りたいです。以下のプログラム

    PHPでディレクトリ名のみ表示する方法が知りたいです。以下のプログラムで「test」というディレクトリ内のファイル一覧(ディレクトリ名とファイル名)を表示するようにしているのですが、この中からディレクトリ名のみ表示させたいのですがどのようにすればいいのでしょうか? よろしくお願いします。 <?php if ($dir = opendir("test/")) { while (($file = readdir($dir)) !== false) { if ($file != "." && $file != "..") { echo "$file<br>\n"; } } closedir($dir); } ?>

    • ベストアンサー
    • PHP
  • php でtabを空白に変換して表示する方法

    お世話になります。 $str = <<< DOC_END01 <script language="JavaScript"> function changeText01(){ __$("#about01").html("表示テスト"); } </script> DOC_END01; echo nl2br(htmlspecialchars($str)); で、javascriptを表示するとき このままだと、tab 上記「_」が削除されてしまいます。 tabを空白などに変換して表示するにはどうしたらよいのでしょうか。 echo nl2br(htmlspecialchars(ereg_replace('/\t/', ' ',$str))); echo nl2br(htmlspecialchars(str_replace('\t', ' '$str))); などとしてもだめでした。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • コマンドラインからPHPを実行するには。(Windows)

    PHPスクリプトをコマンドライン上で実行しようと思い、 >php bookread.php と入力したところ、 >'cdc:\' は、内部コマンドまたは外部コマンド、 >操作可能なプログラムまたはバッチ ファイルとして認識されていません。 と表示されてしまいます。 おそらく環境変数の問題か、もしくは実行しようとしたディレクトリがいけないのかと思いますが、どうしたらよいのかわかりません。 Windowsで、OSはwinXP、また、phpはxamppで取得しました。 実行しようとしたファイルbookread.phpは c:\xampp\htdocs\_test というフォルダの中にあります。 どのディレクトリに移ってから行えばよいのか、もしくは環境変数にどう書き加えればよいのか、教えてください。 私が実行を試したディレクトリは、 c:\xampp\htdocs\_test> と c:\> です。 (ブラウザ上で他のPHPスクリプトを実行することは可能です。)

    • 締切済み
    • PHP

専門家に質問してみよう