簡體   English   中英

帶表達式的preg_match

[英]preg_match with expressions

我有兩種類型的線從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);

重要的是團隊對於兩種類型的線路保持相同的陣列。 我不知道該怎么做。 有幫助嗎? 我敢肯定它只是一個我忘記的表達。

唷。 這就是我想出來的。 它使用條件模式來匹配分數(如果有的話),如果沒有找到分數,它會偷偷地“刪除”'at'(表示它是一個未開始的匹配)。 它將使用相同的技術來獲得第二支球隊的得分。 最后它將匹配最后一個paranthesis組的內容。

被捕組:

  1. 第1組的名字
  2. 1隊比分(如果'在'則為空)
  3. 第2組的名字
  4. 2隊得分(如果'at'則為空)
  5. 最后一個paranthesis的內容

    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 + - 在剩余的paranthesis位之前匹配一些空格
  • (([^]] +)) - 匹配paranthesis內的所有內容

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM