带表达式的preg_match

时间:2013-02-19 20:40:32

标签: php preg-match expression

我有两种从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);

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

1 个答案:

答案 0 :(得分:2)

呼。这就是我想出来的。它使用条件模式来匹配分数(如果有的话),如果没有找到分数,它会偷偷地“删除”'at'(表示它是一个未开始的匹配)。它将使用相同的技术来获得第二支球队的得分。最后它将匹配最后一个paranthesis组的内容。

被捕获的团体:

  1. 第1组名称
  2. 第1组得分(如果'at'则为空)
  3. 第2队名称
  4. Team 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上正确格式化。

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

    击穿

    • ([a-zA-Z] +) - 匹配第一个团队名称
    • (?(?= \ d +)(\ d +)\ s + | \ s + at \ s +) - 使用conditional checklook-ahead assertion来查看是否找到了数字,如果是然后捕获团队1的分数,否则我们匹配,但不要捕获at字符串(忍者技能:))。
    • ([a-zA-Z] +) - 匹配第二个团队名称
    • (?(?= \ d +)(\ d +)) - 对第二支球队得分的另一项条件检查
    • \ s + - 在剩余的paranthesis位之前匹配一些空格
    • (([^]] +)) - 匹配paranthesis内的所有内容