2012-01-30 58 views
22

我试图查看一个文件是否包含发送到页面的字符串。我不知道什么是错,此代码:PHP检查文件是否包含字符串

?php 
    $valid = FALSE; 
    $id = $_GET['id']; 
    $file = './uuids.txt'; 

    $handle = fopen($file, "r"); 

if ($handle) { 
    // Read file line-by-line 
    while (($buffer = fgets($handle)) !== false) { 
     if (strpos($buffer, $id) === false) 
      $valid = TRUE; 
    } 
} 
fclose($handle); 

    if($valid) { 
do stufff 
} 
+0

如果你'的var_dump($缓冲区,$ ID);'而不是用'if'比较它们? – zerkms 2012-01-30 03:34:43

+2

如果您有错误,请提及它。 – Starx 2012-01-30 03:38:12

回答

62

简单多了:

<?php 
    if(strpos(file_get_contents("./uuids.txt"),$_GET['id']) !== false) { 
     // do stuff 
    } 
?> 

在回答关于内存使用情况的意见:

<?php 
    if(exec('grep '.escapeshellarg($_GET['id']).' ./uuids.txt')) { 
     // do stuff 
    } 
?> 
+4

更简单但更耗费内存 – zerkms 2012-01-30 03:38:51

+1

不必将整个文本加载到内存中。 – xdazz 2012-01-30 03:43:06

+1

@zerkms现在怎么样? – 2014-03-15 12:31:50

16

的是代码效率更高同时搜索更大的文件。

$handle = fopen('path_to_your_file', 'r'); 
$valid = false; // init as false 
while (($buffer = fgets($handle)) !== false) { 
    if (strpos($buffer, $id) !== false) { 
     $valid = TRUE; 
     break; // Once you find the string, you should break out the loop. 
    }  
} 
fclose($handle); 
+0

ps,“更高效”,他的意思是'可能更慢(除非file_get_contents使用太多内存以至于开始交换,在这种情况下,这可能会更快),但是应该使用更少的ram',并警告,该算法将不会寻找包含换行符的字符串的工作,除非唯一的换行符在字符串的末尾,请记住:) – hanshenrik 2017-12-01 23:11:01

+0

他确实说过“较大的文件”,如果文件变得非常大(比如带有真正文件的文件许多密码哈希最近发布)可能很容易达到内存限制 – My1 2018-02-23 07:24:03

3
function getDirContents($dir, &$results = array()) 
{ 

    if ($_POST['search'] == null) 
     exit; 

    ini_set('max_execution_time', $_POST['maxtime']); 

    $_SESSION['searchString'] = $_POST['search']; 

    echo "<script>var elm = document.getElementById('search');elm.value='$_POST[search]';</script>"; 

    if (!isset($_POST['case'])) 
     $string = strtolower($_POST['search']); 
    else 
     $string = $_POST['search']; 
    $files = scandir($dir); 

    foreach ($files as $key => $value) { 
     $path = realpath($dir . DIRECTORY_SEPARATOR . $value); 
     if (!is_dir($path)) { 
      $content = file_get_contents($path); 
      if (!isset($_POST['case'])) 
       $content = strtolower(file_get_contents($path)); 
      if (strpos($content, $string) !== false) { 
       echo $path . "<br>"; 
      } 
      $results[] = $path; 
     } else if ($value != "." && $value != "..") { 
      getDirContents($path, $results); 
      $results[] = $path; 
     } 
    } 
    return $results; 
} 

原项目:https://github.com/skfaisal93/AnyWhereInFiles

相关问题