如何确定文件文本搜索是否返回不匹配?

时间:2012-02-25 18:37:41

标签: php

我创建了一段代码,用于检查一组文件中用户提交的字符串的文件。代码搜索目录,返回文件,然后在文件中搜索字符串。用户将通过输入字段输入自定义字符串,然后单击提交按钮。

我已成功创建一个条件,如果用户未输入任何信息,输出将显示“您的搜索未产生任何结果”。但是,我无法弄清楚如何创建一个条件,如果用户输入的文件中没有找到的字符串,那么输出也会是“你的搜索没有结果”。

我现有条件的代码是:

if ((isset($query)) && (empty($query))) {
    echo "Your search produced no results";
}

在这里找到搜索文件并搜索字符串的代码(这是整个PHP文件,实际上,它包括我上面发布的条件。)我需要有关如何创建另一个条件的帮助如果在任何文件中找不到用户输入,则显示一条消息。

如果这看起来不清楚,我会道歉,如果您认为有帮助,我会澄清您需要的任何信息。

致电代码

$query = $_POST['query'];

if ((isset($query)) && (empty($query))) {
    echo "Your search produced no results.";

}
else {
    find_files('.');
}

寻找文件()

function find_files($seed)
{
    if (! is_dir($seed))
        return false;

    $files = array();
    $dirs = array($seed);

    while(NULL !== ($dir = array_pop($dirs)))
    {
        if($dh = opendir($dir))
        {
            while( false !== ($file = readdir($dh)))
            {
                if($file == '.' || $file == '..') continue;

                $path = $dir . '/' . $file;

                if (is_dir($path)) {
                    $dirs[] = $path;
                }
                else {
                    if (preg_match('/^.*\.(php[\d]?|js|txt)$/i', $path)) { 
                        check_files($path);
                    }
                }
            }
        }

        closedir($dh);
    }
}

check_files()

function check_files($this_file) 
{
    $query = $_POST['query'];

    $str_to_find = $query;

    if(!($content = file_get_contents($this_file))) {
        echo("Could not check $this_file");
    }
    else {
        if (stristr($content, $str_to_find)) {
            echo("$this_file -> contains $str_to_find");
        }
    }

    unset($content);
}

2 个答案:

答案 0 :(得分:3)

如果查询不为空,则只执行find_files函数,如果返回false则不执行任何操作,因此您需要评估调用find_files的结果。例如,您可以这样做:

if ((isset($query)) && (empty($query))) {
    echo "<p style=\"color:darkgray; font-family:arial\">Your search produced no results</p>";
}
elseif (!find_files('.'))
{
    echo "<p style=\"color:darkgray; font-family:arial\">Your search produced no results</p>";
}

条件是您更新find_files函数以在所有失败的情况下返回false。

或者你可以更新find_files函数,以便在出现错误时返回一个字符串,并将字符串留空以便成功执行

if ((isset($query)) && (empty($query))) {
    echo "<p style=\"color:darkgray; font-family:arial\">Your search produced no results</p>";
}
else 
{
    $result = find_files('.');
    if (!empty($result))
    {
        echo "<p style=\"color:darkgray; font-family:arial\">".$result."</p>";
    }
}

有关您的代码的一些注意事项将提高可读性和代码质量:

  • 适当的缩进将节省大量维护时间;
  • 当使用if else imbrications时总是使用花括号,即使它只是一个指令。提高可读性并避免错误。
  • 访问函数外部声明的变量时(在过程代码中)使用global关键字。例如,要访问check_files函数中的查询变量,请使用global $query;而不是从帖子中再次检索变量。
  • 除非有特殊原因,否则
  • 使用$ _REQUEST而不是$ _POST或$ _GET。统一代码,使代码更易读,从GET更改为POST,反之亦然,无需更改代码即可完成。

答案 1 :(得分:1)

如果找到至少一个匹配文件,您可以使find_files函数返回布尔值:true,否则为false。然后更新您的if条件:

if ((isset($query)) && (empty($query)) && !find_files('.')) {
    echo "<p style=\"color:darkgray...";
}

由于&&被延迟评估,因此只有find_files不为空时才会调用$query