web-dev-qa-db-fra.com

PHP pour rechercher dans un fichier texte et afficher la ligne entière

En utilisant php, j'essaye de créer un script qui va chercher dans un fichier texte et qui va récupérer toute la ligne et l’échanger.

J'ai un fichier texte (.txt) intitulé "numorder.txt" et dans ce fichier texte, il y a plusieurs lignes de données, avec de nouvelles lignes toutes les 5 minutes (à l'aide du travail cron). Les données ressemblent à:

2 aullah1
7 name
12 username

Comment pourrais-je créer un script php qui recherchera les données "aullah1", puis saisira la ligne entière et y fera écho? (Une fois renvoyé, il devrait afficher "2 aullah1" (sans les guillemets).

Si je n'ai rien expliqué clairement et/ou si vous souhaitez que je vous explique plus en détail, veuillez commenter.

42
AUllah1

Et un exemple de PHP), plusieurs lignes correspondantes seront affichées:

<?php
$file = 'somefile.txt';
$searchfor = 'name';

// the following line prevents the browser from parsing this as HTML.
header('Content-Type: text/plain');

// get the file contents, assuming the file to be readable (and exist)
$contents = file_get_contents($file);
// escape special characters in the query
$pattern = preg_quote($searchfor, '/');
// finalise the regular expression, matching the whole line
$pattern = "/^.*$pattern.*\$/m";
// search, and store all matching occurences in $matches
if(preg_match_all($pattern, $contents, $matches)){
   echo "Found matches:\n";
   echo implode("\n", $matches[0]);
}
else{
   echo "No matches found";
}
67
Lekensteyn

Fais-le comme ça. Cette approche vous permet de rechercher un fichier de toute taille (la grande taille ne plantera pas le script) et vous renverra . TOUTES les lignes qui correspondent à la chaîne souhaitée.

<?php
$searchthis = "mystring";
$matches = array();

$handle = @fopen("path/to/inputfile.txt", "r");
if ($handle)
{
    while (!feof($handle))
    {
        $buffer = fgets($handle);
        if(strpos($buffer, $searchthis) !== FALSE)
            $matches[] = $buffer;
    }
    fclose($handle);
}

//show results:
print_r($matches);
?>

Notez que strpos est utilisé avec !== opérateur.

48
shamittomar

Utiliser file() et strpos() :

<?php
// What to look for
$search = 'foo';
// Read from file
$lines = file('file.txt');
foreach($lines as $line)
{
  // Check if the line contains the string we're looking for, and print if it does
  if(strpos($line, $search) !== false)
    echo $line;
}

Lorsque testé sur ce fichier:

foozah
barzah
abczah

Il produit:

foozah


Mise à jour:
Pour afficher du texte si le texte n’est pas trouvé, utilisez quelque chose comme ceci:

<?php
$search = 'foo';
$lines = file('file.txt');
// Store true when the text is found
$found = false;
foreach($lines as $line)
{
  if(strpos($line, $search) !== false)
  {
    $found = true;
    echo $line;
  }
}
// If the text was not found, show a message
if(!$found)
{
  echo 'No match found';
}

Ici, j'utilise le $found variable pour savoir si une correspondance a été trouvée.

20
Frxstrem

on dirait que vous feriez mieux de vous écarter de system("grep \"$QUERY\"") puisque ce script ne sera pas particulièrement performant de toute façon. Sinon http://php.net/manual/en/function.file.php vous montre comment faire une boucle sur les lignes et vous pouvez utiliser http://php.net/manual/ en/function.strstr.php pour trouver des correspondances.

4
Novikov
 <?php
 // script.php


  $searchfor = $_GET['keyword'];

         $file = 'users.txt';

   $contents = file_get_contents($file);
     $pattern = preg_quote($searchfor, '/');
    $pattern = "/^.*$pattern.*\$/m";

     if(preg_match_all($pattern, $contents, $matches)){
            echo "Found matches:<br />";
       echo implode("<br />", $matches[0]);
      }
       else{
             echo "No matches found";
        fclose ($file); 
         }
       ?>
3
user5521731