$re = '/# Time.
(?<=\|) (?:\s+ [^(]? )
([0-2][0-9]) (?:\s*) (:) \s* ([0-5][0-9]) (?:\s*)
(-)? (?: (?:\s*) ([0-2][0-9]) (?:\s*) (:) (?:\s*) ([0-5][0-9]) )?
(?= [^\)]? \s+ \|)
|
# Total.
(?<=\| ) (?:\s+) (\d+[m]) (?=\s+\|)/mx';
$str = '# Todo
| Tracker | Task | Backlog |
| ----------: | :------------- | :------------ |
| 00:00-00:00 | [x] Task one | [[wiki.link |
| 00:00-00:00 | | |
| 00:00-00:00 | | |
| 00:00- | | |
| | | |
| 10m | | |
| | | |
| 00:00 | [<] Task two | [[wiki.link]] |
| | [<] Task three | [[wiki.link]] |
| (00:00) | [<] Task two | [[wiki.link]] |
| 00:00) | [<] Task two | [[wiki.link]] |
Time outside the table 00:00 that must not be selected.
Group 1: `00` (timer.start.hour)
Group 2: `:` (timer.start.colon)
Group 3: `00` (timer.start.minute)
Group 4: `-` (timer.separator)
Group 5: `00` (timer.end.hour)
Group 6: `:` (timer.end.colon)
Group 7: `00` (timer.end.minute)
Group 8: `00` (timer.total)
# Alternative
# Time (not supported by VS Code).
#(?=
# \\| \\s+ .*?
# ([0-2][0-9]) \\s* (:) \\s* ([0-5][0-9])
# (?:
# \\s* (-) \\s*
# ([0-2][0-9]) \\s* (:) \\s* ([0-5][0-9])
# )?
# .*? \\s+ \\|
#)
#|
# Total not supported by VS Code).
#(?= \\| \\s+ (\\dm) \\s+ \\| )';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
// Print the entire match result
var_dump($matches);
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for PHP, please visit: http://php.net/manual/en/ref.pcre.php