首页 > 解决方案 > 文本文件解析并转换为 JSON?

问题描述

首先,感谢您阅读本文!其次,我无法控制从中获取数据的 .txt 文件。我希望能够获取数据并将其分成完整的比赛,然后显示这些结果,然后显示即将举行的比赛并显示这些结果。

例如:

最近完成的比赛

W6: John Smith vs. Joe Smith, 0-0
L7: Doug Smith vs. Jason Smith, 1-2
and so on

即将到来的比赛

W1: Joan Smith vs. Bruce Smith, 0-0
W1: Jenn Smith vs. David Smith, 0-0
and so on

这是一个示例文件: https ://drive.google.com/file/d/11dW2pOK-MXHGRzQhJWb37tlWMqazj8UZ/view?usp=sharing

来自上述链接的示例数据:

  <|>  Most Recent Completed Matches:  W6: Jason Bertolo vs. Ed Gabele, 0-0 | W6: Ed Gabele vs. Jason Bertolo, 0-0 | L7: Doug Metcalf vs. Jason Bertolo, 1-2 | L6: Tom Walsh vs. Jason Bertolo, 0-2 | L5: Jason Bertolo vs. Kevin Kronk, 2-0 | L5: Tom Walsh vs. Zach Dotson, 2-0 | L4: Kevin Kronk vs. Bruce Patete, 2-1 | L4: Zach Dotson vs. Tom Dotson, 0-0 | L3: Bruce Patete vs. Joseph Hornback, 2-0 | L3: Kevin Kronk vs. Matt Smith, 2-1 | L3: Matt Borders vs. Tom Dotson, 1-2 | L3: Zach Dotson vs. Mick Pillar, 2-0 | L2: David Mosel vs. Joseph Hornback, 0-2 | L2: Antoine Tucker vs. Matt Smith, 0-0 | L2: Tom Dotson vs. Mike Conley, 2-1 | L2: Mick Pillar vs. Hannah Fields, 2-0 | L1: Mike Minor vs. Joseph Hornback, 0-2 | L1: David Mosel vs. Tom Johnson, 2-1 | L1: Matt Smith vs. Jennifer Hamilton, 2-1 | L1: Lori Fields vs. Mike Conley, 1-2 | L1: Owen Miller vs. Tom Dotson, 1-2 | L1: Ken Kronk vs. Hannah Fields, 0-2 | W5: Ed Gabele vs. Doug Metcalf, 3-1 | W4: Doug Metcalf vs. Tom Walsh, 3-2 | W4: Jason Bertolo vs. Ed Gabele, 1-3 | W3: Tom Walsh vs. Kevin Kronk, 3-0 | W3: Bruce Patete vs. Doug Metcalf, 1-3 | W3: Ed Gabele vs. Zach Dotson, 3-1 | W3: Matt Borders vs. Jason Bertolo, 0-3 | W2: Kevin Kronk vs. Ken Kronk, 3-2 | W2: Mick Pillar vs. Tom Walsh, 2-3 | W2: Doug Metcalf vs. Owen Miller, 3-2 | W2: Lori Fields vs. Bruce Patete, 1-3 | W2: Matt Smith vs. Zach Dotson, 1-3 | W2: Antoine Tucker vs. Ed Gabele, 0-3 | W2: David Mosel vs. Jason Bertolo, 0-3 | W2: Matt Borders vs. Mike Minor, 3-1 | W1: Joseph Hornback vs. Ken Kronk, 2-3 | W1: Tom Walsh vs. Tom Johnson, 3-0 | W1: Jennifer Hamilton vs. Bruce Patete, 0-3 | W1: Zach Dotson vs. Mike Conley, 3-2 | W1: Ed Gabele vs. Tom Dotson, 3-0 | W1: Mike Minor vs. Hannah Fields, 3-1  <|>  Upcoming Matches:    <|>  

到目前为止我尝试过的代码是:

<?php
 $text = file_get_contents('https://drive.google.com/uc?export=download&id=11dW2pOK-MXHGRzQhJWb37tlWMqazj8UZ');
 $json = (explode('|',$text));
 //var_dump ($json);
 //print "\n";
 $trimmed = trim($text);
 print_r ($trimmed);
 ?>

它看起来不错,但对于我的生活,我无法弄清楚如何简单地列出两个“|”之间的所有值 人物。

关于我可以做些什么来操纵这个文本以达到我想要的结果的任何想法?

此外,您应该知道,在实际比赛期间,此数据每 60 秒就会更改一次。我不知道这是否重要,但我想我会确保你知道这些数据不是静态的。唯一不变的是 <|> 表示最近的匹配或已完成的匹配,并且结果总是在两个 | 之间。人物。

感谢你的宝贵时间!

标签: phpjsonregextext-parsing

解决方案


这是您需要的开始。有一些方法可以使它更紧凑,但我要清楚。您应该对 preg_match 调用的结果添加错误检查,以便知道它是否由于某种原因而失败。

<?php
$text = file_get_contents('sample_data');

// The sample data has two sections,
// one for completed matches and one for upcoming matches.
// Extract the 'variable' text of these two sections:
preg_match('/^ *<\|>  Most Recent Completed Matches: (.+) <\|>  Upcoming Matches: (.+) <\|> *$/', $text, $reg_matches);

$completed_text = $reg_matches[1];
$upcoming_text  = $reg_matches[2];

// Within the text of a section, the matches are separated by '|',
// so split the section-text on that character:
$completed_array = explode("|", $completed_text);
$upcoming_array  = explode("|", $upcoming_text);

echo "\n";
echo "Most Recent Completed Matches\n";
echo "\n";
foreach ( $completed_array as $match_text )
{
    echo "$match_text\n";
}

echo "\n";
echo "Upcoming Matches\n";
echo "\n";
foreach ( $upcoming_array as $match_text )
{
    echo "$match_text\n";
}

?>

推荐阅读