Найти строку в текстовом файле, затем найти 1-й экземпляр другой строки и получить следующий текст - PullRequest
0 голосов
/ 02 марта 2020

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

Вот пример текстовый файл, который мне нужно будет найти в ...

Tournament=Test
Number=897  // I need to locate this Number.
Currency=Primary
BuyIn=0.01+0.02
PrizeBonus=0
MultiplyBonus=No
Entrants=2
Late=0
Tickets=0
Removed=0
Rebuys=0
AddOns=0
RebuyCost=0+0
NetBonus=0
StopOnChop=No
Start=2020-03-02 04:07:56
Place2=Tuck (0)
Place1=TuckStream (0.02) // Then I need to locate "Place1=", then get the name that follows.
Stop=2020-03-02 04:08:47

Краткое содержание: Мне нужно взять имя победителя из текстового файла после того, как в нем будет найден правильный номер турнира. В одном текстовом файле хранятся несколько турниров. Текстовый файл обновляется после завершения турнира, затем запускается событие и предоставляет мне новый номер турнира в строке.

Прямо сейчас я просто собираю все содержимое файла (как выше) и размещение всей вещи, чтобы разойтись с веб-крючком. Я бы предпочел публиковать только имя победителя, "TuckStream", как в примере выше.

Мне также нужно выполнить другое действие только с именем игроков, поэтому мне нужно добавить его в переменную $ Winner (для пример). Вот текущий код в обработчике событий, который публикует все содержимое файла ...

case "TourneyFinish":
  fwrite($f,"Event = " .  $event . "\n");
  fwrite($f,"Name = "  .  $_POST["Name"] . "\n");
  fwrite($f,"Number = " . $_POST["Number"] . "\n");
  fwrite($f,"Time = " .   $_POST["Time"] . "\n");
  fwrite($f,"\n");
  $TourneyName = $_POST["Name"];

  // wait for file to be written to disk
  sleep(10);
  // find latest file     
  $path = "C:/TourneyResults"; 
  $latest_ctime = 0;
  $latest_filename = '';    

  $d = dir($path);
  while (false !== ($entry = $d->read())) {
  $filepath = "{$path}/{$entry}";
  if (is_file($filepath) && filectime($filepath) > $latest_ctime) {
    $latest_ctime = filectime($filepath);
    $latest_filename = $entry;
  }
}

    // post message in discord chan #tourney-annoucements
    $getinfo = file_get_contents($path . "/" . $latest_filename);
    $message = "**$TourneyName Results** \n $getinfo";
    $data = ['content' => $message];
    $options = [
                'http' => [
                'method' => 'POST',
                'header' => 'Content-Type: application/json',
                'content' => json_encode($data)
                ]
            ];
    $context = stream_context_create($options);
    $result = file_get_contents('https://discordapp.com/api/webhooks/mywebhook', false, $context);

  break;

1 Ответ

0 голосов
/ 02 марта 2020

Вы можете использовать preg_match_all, чтобы получить как число, так и победителя в одном go.

$getinfo = file_get_contents($path . "/" . $latest_filename);

preg_match_all("/Number=(\d+).*?Place1=(.*?)\s/s", $getinfo, $info);

$message = "**$TourneyName Results** \nTournament Number " . $info[1][0] . "\nWinner " .$info[2][0];
echo $message;

возвращает:

**something undefined Results** 
Tournament Number 897
Winner TuckStream

Шаблон регулярного выражения сначала находит Number и получает цифры, следующие за этой частью: Number=(\d+).
Затем он переходит к Place1 с .*? и использует эту часть Place1=(.*?)\s, чтобы найти имя победителя.
Последняя часть - /s, что означает, что он ищет многоканальный.

...