2

これをお読みいただきありがとうございます。内容の質に関係なく、すべての回答に感謝します。:)

テキスト ファイルで特定のテキストを検索する php スクリプトを作成しようとしています。ユーザーが HTML フォーム内に特定のテキストを入力すると、php スクリプトはテキスト ファイル内でその特定のテキストを検索する必要があります。

HTML フォームの入力フィールドの値は「username」であり、php ドキュメント内では変数「$username」が入力されたデータです。以下に例を示します。

$username = $_POST['username'];

以下のテキスト ファイルは「begin.txt」と呼ばれます。

「AULLAH1」「2010 年 1 月 7 日 15:28」「55621454」「123456」「123456.00」

「ユーザー名」「2010 年 7 月 3 日午後 6 時 21 分」「55621454」「123456」「123456.00」

「AULLAH1」「2010 年 7 月 7 日 15:05」「55621454」「189450」「123456.00」

「SUPREMEGAMER」「2010 年 7 月 8 日午後 6 時 42 分」「55621454」「123456」「123456.00」

人が HTML フォームに「AULLAH1」と入力した場合、php スクリプトにテキスト ファイルの最後の「AULLAH1」エントリを取得させたいと思います (たとえば、最初の行ではなく 3 行目を取得する必要があります。テキスト「AULLAH1」を含む最後のエントリ)。また、人が特定のテキストを入力するときは、単にドキュメントやテキストを取得するのではなく、行全体を取得する必要があります: "AULLAH1" "07/07/2010 15:05" "55621454" "189450 " "123456.00" を php 変数に入れます。おそらく "$grabbed" のようなものでしょうか? できれば全然。

すべての支援に感謝します。返信をお待ちしております。ありがとうございました。:) 私が何かを明確に説明していない場合、および/またはより詳細に説明してほしい場合は、返信してください. :)

ありがとうございました。

4

5 に答える 5

3

SplFileObjectファイルを1行ずつ使用および反復できます。

file()ファイルを反復処理する方が、ファイルの内容全体を配列またはfile_get_contents()変数に読み取らないため、使用するよりもはるかにメモリ効率が高いことに注意してください。

$username = 'AULLAH1';
$file = new SplFileObject("data.csv");
$grabbed = FALSE;
while (!$file->eof()) {
     $data = $file->fgetcsv(' ');
     if($data[0] === $username) {
         $grabbed = $file->current();
     }
}
echo $grabbed;

fgetcsv()ただし、行を解析するときに区切り文字、囲み、エスケープ文字が考慮されるため、正確には高速ではありません。この方法で数百または数千行を解析する必要がある場合は、実際にそれが必要であることを確認してください。


別の方法は、現在の行のどこかにユーザー名文字列が含まれているかどうかを確認することです。質問で示したファイル形式では、残りのフィールドに数字が含まれているため、これは実行可能であり、誤検知は発生しません。

$username = 'AULLAH1';
$file = new SplFileObject("data.txt");
$grabbed = FALSE;
foreach($file as $line) {
    if(strpos($line, $username) !== FALSE) {
        $grabbed = $line;
    }
}
echo $grabbed;

$ usernameが位置1で見つかったことを確認する場合は、if条件を変更してテストし=== 1ます。


何らかの理由で、ユーザー名が含まれるすべての行を表示したい場合は、カスタムFilterIteratorを記述して、ファイルの内容を反復処理できます。

class UsernameFilter extends FilterIterator
{
    protected $_username;
    public function __construct(Iterator $iterator, $username)
    {
        $this->_username = $username;
        parent::__construct($iterator);
    }
    public function accept()
    {
        return strpos($this->current(), $this->_username) !== FALSE;
    }
}

次に、単にを使用できますforeach。FilterIteratorは各行をに渡し、accept()TRUEを返す行のみが実際に使用されます。

$filteredLines = new UsernameFilter(new SplFileObject('data.txt'), 'AULLAH1');
foreach($filteredLines as $line) {
    echo $line;
}

上記は出力します

"AULLAH1" "01/07/2010 15:28 " "55621454" "123456" "123456.00"
"AULLAH1" "07/07/2010 15:05 " "55621454" "189450" "123456.00"

これらの行を配列にしたい場合は、次のことができます。

$lines = iterator_to_array($filteredLines);

そして最後のアイテムを見る

echo end($lines);
于 2010-08-21T21:20:13.403 に答える
3

資格情報を保存するためにテキスト ファイルを使用することはありませんが、少なくともテキスト ファイルの形式を CSV レイアウトに変更する必要がある場合

このようにしてください

AULLAH1,01/07/2010 15:28,55621454,123456,123456.00
USERNAME,7/3/2010 6:21 PM,55621454,123456,123456.00
AULLAH1" "07/07/2010 15:05 " "55621454" "189450" "123456.00
SUPREMEGAMER,7/8/2010 6:42 PM,55621454,123456,123456.00

PHP でファイル行 my line を読む

<?php
$lines = file('begin.txt');
foreach($lines as $line)
{
     if(preg_match('/(?<username>.*?),(?<ts>.*?),(?<id_1>.*?),(?<id_2>.*?),(?<balance>.*?)/',$line,$parts))
     {
         if($_POST['username'] == $parts['username'])
         {
             //Do what you need here.
             break;
         }
     }
}
?>

また、explode witch を使用することもできますが、より高速ですが、配列のキーの自動生成に制限されています!

<?php
$lines = file('begin.txt');
foreach($lines as $line)
{
    $parts = explode(',',$line);
     if($_POST['username'] == $parts[0])
     {
         //Do what you need here.
         break;
     }
}
?>
于 2010-08-21T21:40:16.433 に答える
2

これは私が思いつくことができる最短です:

$list = file_get_contents('data.txt');
echo strstr(substr($list, strrpos($list, 'AULLAH1')-1), PHP_EOL, TRUE);

これにより、ファイルがメモリに読み込まれます。次に、文字列 'AULLAH1' が最後に出現した位置のオフセットを見つけます。この発生の 1 文字前から次の改行文字までのすべてが返されます。

これには、 の 3 番目の引数のために PHP5.3 が必要であり、上記のイテレータ ソリューションstrstr()よりも多くのメモリが必要です。改行によっては、PHP_EOL をファイルで使用されている改行文字に変更する必要がある場合があります。

于 2010-08-21T22:26:16.797 に答える
2

使用preg_match_all()すると解決策になる可能性があります:

$file = file_get_contents($filename);
$username = 'ALLUAH1';
preg_match_all('/^"'.preg_quote($username, '/').'".*$/m', $file, $matches);
  // Note that the '/m' flag of the regex makes '^' and '$' match
  // the beginning and end of each line.
  // Also note that I am using preg_quote() to escape special regex characters

$grabbed = array_pop($matches[0]);

$grabbedそのユーザーの最後の行の値を保持する必要があります。

関連リンク:

于 2010-08-21T21:57:12.690 に答える
2

これは、これを実装することを考えることができる最も簡単な方法です。このメソッドは、ファイルの行を逆順に実行するだけなので、すべての行を検索する必要はありません。また、二重引用符で囲まれたユーザー名が、入力ファイルの各行の最初にあると想定しています。

$username = "AULLAH1";
$input_file = file("begin.txt");

$grabbed = "";

for($i = count($input_file) - 1; $i >= 0; $i--)
{
  // Note: Exactly zero (string starts the line), NOT "FALSE"
  if(strpos($input_file[$i], "\"$username\"") === 0)
  {
    $grabbed = $input_file[$i];
    break;
  }
}
于 2010-08-21T22:01:23.710 に答える