PHP скрипт для захвата всей строки - PullRequest
2 голосов
/ 22 августа 2010

Спасибо, что нашли время, чтобы прочитать это, и я буду благодарен за каждый отдельный ответ, независимо от качества контента.:)

Я пытаюсь создать скрипт php, который ищет текстовый файл для конкретного текста.Человек вводит определенный текст в HTML-форме, и скрипт php должен искать этот конкретный текст в текстовом файле.

Значение поля ввода в HTML-форме - «имя пользователя» и в phpdocument, переменная "$ username" представляет собой введенные данные, пример показан ниже:

$username = $_POST['username'];

Текстовый файл ниже называется begin.txt:

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

"ИМЯ ПОЛЬЗОВАТЕЛЯ" "03.07.2010 18:21" "55621454" "123456" "123456.00"

"AULLAH1" "07.07.2010 15:05" "55621454" "189450" "123456.00"

"SUPREMEGAMER" "08.07.2010 18:42" "55621454" "123456 "" 123456.00 "

Если человек введет в HTML-форму" AULLAH1 ", я бы хотел, чтобы скрипт php захватил последнюю запись" AULLAH1 "в текстовом файле (например, он должен получитьтретья строка, а не первая, поскольку третья строка является последней записью, содержащей текст «AULLAH1»).Кроме того, когда человек вводит определенный текст, он не должен просто захватывать документ или текст, он должен захватывать всю строку: "AULLAH1" "07.07.2010 15:05" "55621454" "189450Msgstr "" 123456.00 "и поместите его в переменную php, может быть что-то вроде" $ grabbed "?Если это вообще возможно.

Вся помощь приветствуется, и я с нетерпением жду ваших ответов;благодарю вас.:) Если я ничего не объяснил четко и / или вы хотите, чтобы я объяснил более подробно, пожалуйста, ответьте.:)

Спасибо.

Ответы [ 5 ]

3 голосов
/ 22 августа 2010

я бы не использовал текстовый файл для хранения учетных данных, но если вам нужно хотя бы изменить формат текстового файла на формат 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

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

Вы также можете использовать функцию "Разнесение", которая работает быстрее, но ограничена автоматической генерацией ключей для массива!

<?php
$lines = file('begin.txt');
foreach($lines as $line)
{
    $parts = explode(',',$line);
     if($_POST['username'] == $parts[0])
     {
         //Do what you need here.
         break;
     }
}
?>
2 голосов
/ 22 августа 2010

Это самое короткое, что я могу придумать:

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

Это прочитает файл в память.Затем он находит смещение последнего вхождения строки 'AULLAH1'.Все за одну букву до этого вхождения до следующего символа новой строки будут возвращены.

Это требует PHP5.3 из-за третьего аргумента strstr() и требует больше памяти, чем решение итератор выше.В зависимости от ваших новых строк, вам может потребоваться изменить PHP_EOL на символы новой строки, используемые в файле.

2 голосов
/ 22 августа 2010

Это самый простой способ, который я могу придумать для реализации этого. Этот метод просто проходит по строкам файла в обратном порядке, и поэтому не нужно искать каждую строку. Он также предполагает, что имя пользователя, заключенное в двойные кавычки, является самым первым элементом в каждой строке входного файла.

$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;
  }
}
2 голосов
/ 22 августа 2010

Использование 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 должно содержать значение последней строки этого пользователя.

Ссылки по теме:

2 голосов
/ 22 августа 2010

Вы можете использовать SplFileObject и перебирать файл строка за строкой.

Обратите внимание, что итерация по файлу намного более эффективна по сравнению с использованием 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() учитывает разделители, вложения и escape-символы при разборе строки, это не совсем быстро, хотя. Если вам нужно проанализировать пару сотен или тысяч строк таким образом, убедитесь, что вы действительно нуждаетесь в этом.


Альтернативой было бы просто проверить, содержит ли текущая строка где-нибудь строку имени пользователя. В формате файла, который вы показываете в вопросе, это будет возможно, потому что остальные поля содержат цифры, поэтому не может быть никаких ложных срабатываний:

$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);
...