2

Webサイトのフォルダディレクトリ(スクリプトがアップロードされているのと同じディレクトリ)を再帰的に検索し、すべてのファイルを開いて読み取り、特定の文字列を検索するにはどうすればよいのでしょうか。

たとえば、私はこれを持っているかもしれません:

search.php?string = hello%20world

これはプロセスを実行し、次のような何かを出力します

"hello world found inside"

httpdocs
/index.php
/contact.php

httpdocs/private/
../prviate.php
../morestuff.php
../tastey.php

httpdocs/private/love
../../goodness.php

プライベートファイルとリンクされていないファイルは丸いので、リンククロールしたくありませんが、他のすべての非バイナリファイルに実際にアクセスできるようにしたいと思います。

どうもありがとう

オーウェン

4

3 に答える 3

3

すぐに思いつく解決策は 2 つあります。

1) コマンドで使用grepするexec(サーバーがサポートしている場合のみ):

$query = $_GET['string'];
$found = array();
exec("grep -Ril '" . escapeshellarg($query) . "' " . $_SERVER['DOCUMENT_ROOT'], $found);

完了すると、クエリを含むすべてのファイル パスが に配置され$foundます。この配列を繰り返し処理し、必要に応じて処理/表示できます。

2) フォルダーを再帰的にループして各ファイルを開き、文字列を検索して、見つかった場合は保存します。

function search($file, $query, &$found) {
    if (is_file($file)) {
        $contents = file_get_contents($file);
        if (strpos($contents, $query) !== false) {
            // file contains the query string
            $found[] = $file;
        }
    } else {
        // file is a directory
        $base_dir = $file;
        $dh = opendir($base_dir);
        while (($file = readdir($dh))) {
            if (($file != '.') && ($file != '..')) {
                // call search() on the found file/directory
                search($base_dir . '/' . $file, $query, $found);
            }
        }
        closedir($dh);
    }
}

$query = $_GET['string'];
$found = array();
search($_SERVER['DOCUMENT_ROOT'], $query, $found);

これは、要求された文字列の各サブフォルダー/ファイルを (未テストで) 再帰的に検索する必要があります。見つかった場合は、変数に格納されます$found

于 2012-07-16T16:59:30.723 に答える
1

ディレクトリリストがオンになっている場合は、試すことができます

<?php
$dir = "http://www.blah.com/";
foreach(scandir($dir) as $file){
  print '<a href="'.$dir.$file.'">'.$file.'</a><br>';
}
?>

また

<?php
$dir = "http://www.blah.com/";
$dh  = opendir($dir);
while (false !== ($file = readdir($dh))) {
  print '<a href="'.$dir.$file.'">'.$file.'</a><br>';
}
?>
于 2012-07-16T16:51:22.400 に答える
0

上記の方法のいずれも使用できない場合は、コールバックを使用して再帰的なディレクトリウォークを使用できます。そして、コールバックを、指定されたファイルの指定された文字列をチェックする関数として定義します。

于 2012-07-16T16:50:41.310 に答える