Estoy tratando de ver si hay un archivo que contiene una cadena de caracteres que se envía a la página. No estoy seguro de lo que está mal con este código:

?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
}
  • Lo que si var_dump($buffer, $id); en lugar de comparar a ellos por if?
  • Si usted tiene un error, por favor menciónelo.
InformationsquelleAutor WildBill | 2012-01-30

5 Comentarios

  1. 74

    Mucho más simple:

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

    En respuesta a los comentarios sobre el uso de la memoria:

    <?php
        if( exec('grep '.escapeshellarg($_GET['id']).' ./uuids.txt')) {
            //do stuff
        }
    ?>
    • Mucho más sencillo, pero más memoria de la que consume
    • No tienen que cargar todo el texto a la memoria.
    • ¿Qué pasa ahora?
    • respuesta a los comentarios sobre el uso de memoria no funciona para mí
    • 1er ejemplo no funcionará si la cadena a buscar es en la primera o en la última línea del archivo.
    • Por favor, elaborar más sobre tu comentario anterior.
    • que no funciona en todas las máquinas. Es más en particular no funciona en Windows.
    • seguro, crear un archivo con 10 cadenas, aplicar ese código, se va a perder la 1ª cuerda y de la última.

  2. 17

    El código es más eficiente mientras que la búsqueda de archivos de gran tamaño.

    $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);
    • ps, por more efficient, que significa probably slower (unless file_get_contents use so much ram that you start swapping, in which case this might be faster), but should use significantly less ram, también la advertencia, este algoritmo NO trabajo para la búsqueda de cadenas que contiene saltos de línea, excepto si la única newline es en el final de la cadena, ten eso en mente 🙂
    • él dijo que «los archivos más grandes» y bien, si el fichero es muy grande (como el archivo con el que realmente muchos de los hash de las contraseñas que fue lanzado recientemente) uno podría fácilmente alcanzar el límite de memoria
  3. 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;
    }

    Proyecto Original: https://github.com/skfaisal93/AnyWhereInFiles

  4. 1

    Que esto funciona, he probado de extremo a extremo.

    <?php
    //incoming record id 
    //checking in uuids.txt file
    if (exec('cat ./uuids.txt | grep '.escapeshellarg($_GET['id']))) {
         //do stuff
         echo 'found...';
    } 
    ?>
  5. -1
    <?php
        function getDirContents($dir, &$results = array()){
            $files = scandir($dir);
            foreach($files as $key => $value){
                $path = realpath($dir.DIRECTORY_SEPARATOR.$value);
                if(!is_dir($path)) {
                    $results[] = $path;
                } else if($value != "." && $value != "..") {
                    getDirContents($path, $results);
                    $results[] = $path;
                }
            }
            return $results;
        }
        $res = getDirContents('path');
        $searchfor = 'search string';
        foreach ($res as $file) {
            if(is_dir($file)) {}else{
                $contents = file_get_contents($file);
                $pattern = preg_quote($searchfor, '/');
                $pattern = "/^.*$pattern.*$/m";
                if(preg_match_all($pattern, $contents, $matches)){ ?>
                    <tr>
                        <td> <?php $string = implode("\n", $matches[0]); echo str_replace($searchfor,'<strong style="background-color:#ffff00">'.$searchfor.'</strong>',$string); ?> </td>
                        <td> <?php echo  $file; ?> </td>
                    </tr>
                <?php }else{
                    //echo "No matches found";
                }
            }
        }
    ?>

Dejar respuesta

Please enter your comment!
Please enter your name here