Php 在文本文件中查找字符串,然后查找另一个字符串的第一个实例,然后获取后面的文本

Php 在文本文件中查找字符串,然后查找另一个字符串的第一个实例,然后获取后面的文本,php,string,search,Php,String,Search,我需要在文本文件中找到一个字符串。一旦找到,然后在第一个字符串下面找到第二个字符串的第一个实例,然后获取紧跟在第二个字符串后面的文本,并将该文本添加到一个变量中,以便稍后使用 这里是一个文本文件的样本,我需要在里面搜索 Tournament=Test Number=897 // I need to locate this Number. Currency=Primary BuyIn=0.01+0.02 PrizeBonus=0 MultiplyBonus=No Entrants=2 Late=

我需要在文本文件中找到一个字符串。一旦找到,然后在第一个字符串下面找到第二个字符串的第一个实例,然后获取紧跟在第二个字符串后面的文本,并将该文本添加到一个变量中,以便稍后使用

这里是一个文本文件的样本,我需要在里面搜索

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
摘要:在文件中找到正确的比赛编号后,我需要从文本文件中获取获胜者的姓名。同一文本文件中存储了多个巡回赛。文本文件在锦标赛结束后更新,然后运行一个事件并以字符串形式向我提供新的锦标赛号码

现在我只是抓取文件的所有内容(如上所述),然后用webhook将整个内容发布到discord。我更喜欢只发布获奖者的名字,“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;

您可以使用
preg\u match\u all
一次性获得号码和赢家

$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
正则表达式模式首先查找数字,并获取此部分后面的数字:
数字=(\d+)

然后它跳转到带有
*?
的位置1,并使用此部分
Place1=(.*?\s
查找获奖者姓名。

最后一部分是
/s
,这意味着它会搜索多行。

那么您有什么问题?您的意思是需要一个正则表达式来查找897,然后Place1=(这个)?像这样:看起来它满足了我的需要@Andreas,谢谢!我对regex一无所知,但我会努力了解如何使用它。我会给你的解决方案下面的一个镜头,看看它如何进行。@TuckFheman好的,告诉我,如果你需要更多的帮助与代码明白了,对不起,我是一个n00b
Number=($TNumber)
成功了!