我正在尝试编写一些代码来查看服务器中的所有文件并返回包含特定字符串的文件。问题是我只知道我正在寻找的文件中的注释是关键,我觉得这可能会搞砸了。
我有一个函数递归搜索所有目录中的文件,但是文件的读取和字符串的搜索工作不正常。
<?php
$mal = "//###=CACHE START=###";
function getDirContents($dir) {
$files = scandir($dir);
foreach($files as $file) {
if($file == "." || $file == "..") continue;
if(!is_file($dir . $file)){
echo "Folder: " . $dir . $file . "<br />";
getDirContents($dir.$file."/");
} else {
echo "File: " . $dir . $file . "<br />";
$content = file_get_contents($dir . $file);
if (strpos($content, $mal) !== false) {
echo "FOUND" . $dir.$file . "<br>";
}
}
}
}
$dir = "./";
getDirContents($dir);
?>
出于某种原因,这将返回.png和.jpg文件作为&#34; FOUND&#34;而且我不确定为什么。我有很多文件中包含$mal
字符串,但它是评论,我不确定这是否重要。无论哪种方式,它都无法正常工作,也找不到我正在寻找的文件。
答案 0 :(得分:3)
这会失败,因为您正在搜索的内容实际上并不在范围内 - 在函数范围$mal
中实际上是NULL,因此始终可以找到。这在http://php.net/manual/en/language.variables.scope.php
<?php
$a = 1; /* global scope */
function test()
{
echo $a; /* reference to local scope variable */
}
test();
由于echo语句,此脚本不会产生任何输出 指的是$ a变量的本地版本,但它还没有 在此范围内分配了一个值。您可能会注意到这是一个 与C中的全局变量中的C语言略有不同 除非特别说明,否则可自动使用 被本地定义覆盖。这可能会导致一些问题 人们可能无意中改变了一个全局变量。在PHP全局 如果变量必须在函数内声明为全局变量 用于该功能。
解决此问题的快速而肮脏的方法是声明$mal
global
。 Saner将其作为参数传递给您的函数以及目录。