web-dev-qa-db-ja.com

PHP txtファイル内を検索し、行全体をエコーするには

PHPを使用して、テキストファイル内を検索し、その行全体を取得してエコーするスクリプトを作成しようとしています。

「numorder.txt」というタイトルのテキストファイル(.txt)があり、そのテキストファイル内には、5行ごとに新しい行が来る(cronジョブを使用して)数行のデータがあります。データは次のようになります。

2 aullah1
7 name
12 username

データ「aullah1」を検索し、行全体を取得してエコーするphpスクリプトを作成するにはどうすればよいですか? (エコーされると、「2 aullah1」と表示されます(引用符なし)。

何も明確に説明しなかった場合や、さらに詳しく説明してほしい場合は、コメントしてください。

42
AUllah1

また、PHPの例では、一致する複数の行が表示されます。

<?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

このようにします。このアプローチでは、任意のサイズのファイルを検索できます(サイズが大きいとスクリプトがクラッシュしません)、返される必要な文字列に一致するすべての行

<?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);
?>

strpos!==演算子で使用される方法に注意してください。

48
shamittomar

file() および 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;
}

このファイルでテストした場合:

フーザ
barzah
abczah

以下を出力します:

フーザ


更新:
テキストが見つからない場合にテキストを表示するには、次のようなものを使用します。

<?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';
}

ここでは、$found変数を使用して、一致が見つかったかどうかを確認しています。

20
Frxstrem

system("grep \"$QUERY\"")にシステムアウトする方が良いように見えます。そのスクリプトはどちらの場合も特に高性能ではないからです。それ以外の場合 http://php.net/manual/en/function.file.php は行をループする方法を示し、 http://php.net/manual/ en/function.strstr.php 一致を見つけるため。

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

一方通行...

$needle = "blah";
$content = file_get_contents('file.txt');
preg_match('~^(.*'.$needle.'.*)$~',$content,$line);
echo $line[1];

ただし、fopen()およびfread()を使用して1行ずつ読み取り、strpos()を使用する方がよいでしょう。

2
Crayon Violent