0

RSSからプルされている2種類の回線があります。これらは、プレイ中のゲームとまだ開始されていないゲームです。以下のコードは、開始したゲームのみをプルします。

$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」をこっそり「削除」します(開始されていない一致であることを示します)。2番目のチームのスコアにも同じテクニックを使用します。最後に、最後のパランセシスグループの内容と一致します。

キャプチャされたグループ:

  1. チーム1の名前
  2. チーム1のスコア(「at」の場合は空)
  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のスコアをキャプチャします。一致しますが、文字列をキャプチャしないでください(忍者スキル:))。
  • ([a-zA-Z] +)-2番目のチーム名と一致します
  • (?(?= \ d +)(\ d +))-2番目のチームのスコアの別の条件付きチェック
  • \s+-残りのparanthesisビットの前の空白に一致します
  • (([^)] +))-paranthesis内のすべてに一致します
于 2013-02-19T21:34:33.600 に答える