0

我有两种从 RSS 中提取的行。这些是正在玩的游戏和尚未开始的游戏。我在下面的代码只提取已经开始的游戏。

$string = "Tampa Bay 6 Florida 5 (FINAL - OT)
Ottawa 0 Toronto 3 (FINAL)
NY Islanders at Ottawa (7:30 PM ET)
Toronto at Tampa Bay (7:30 PM ET)
San Jose at St. Louis (8:00 PM ET)
Detroit at Nashville (8:00 PM ET)
Vancouver at Chicago (8:30 PM ET)
Los Angeles at Edmonton (10:00 PM ET)";

preg_match_all("/^(\D+)(\d+ )(\D+)(\d+ )\s*\((.*)\)$/m", $string, $result);

echo "<pre>";

print_r($result);

重要的是,对于两种类型的线路,团队保持在同一个阵列中。我不知道该怎么做。有什么帮助吗?我敢肯定这只是我忘记的一种表达方式。

4

1 回答 1

2

呸。这就是我想出的。如果有任何分数,它使用条件模式来匹配分数,如果没有找到分数,它将偷偷地“删除”“at”(表明它是一个未开始的匹配)。它将使用相同的技术来计算第二队的得分。最后它将匹配最后一个括号组的内容。

捕获的组:

  1. 团队 1 名称
  2. 团队 1 得分(如果“在”则为空)
  3. 团队 2 名称
  4. 团队 2 得分(如果'at'则为空)
  5. 最后一个括号的内容

    preg_match_all( '#^([a-zA-Z ]+)(?(?=\d+)(\d+)\s+|\s+at\s+)([a-zA-Z ]+)(?( ?=\d+)(\d+))\s+(([^)]+))#m', $str, $matches );

    // 请注意编辑快乐的用户,正则表达式无法在 SO 上正确格式化。

唯一的问题是您应该修剪团队名称,因为其中可能存在不需要的空格。

分解

  • ([a-zA-Z ]+) - 匹配第一个团队名称
  • (?(?=\d+)(\d+)\s+|\s+at\s+) - 使用条件检查前瞻断言来查看是否找到数字,如果是,则捕获团队 1 的分数,否则我们匹配但不捕获 at 字符串(忍者技能:))。
  • ([a-zA-Z ]+) - 匹配第二个团队名称
  • (?(?=\d+)(\d+)) - 另一个条件检查第二队的得分
  • \s+ - 在剩余的括号位之前匹配一些空格
  • (([^)]+)) - 匹配括号内的所有内容
于 2013-02-19T21:34:33.600 回答