Kan det inte vara för att .+ matchar alla tecken, även mellanslag. Och tar därför med mellanslaget efter "tåg ". Om det bara är ett ord du vill ta ut kan du inte använda "till (\w+) mot"
$str = "Ta buss 1337 från";
preg_match("/(Ta|till) (.+) från/", $str, $matches);
$str2 = "Den går från En station 19:23 och kommer till En hållplats ca 19:30";
preg_match("/från (\D+) (\d{2}:\d{2}) .* till (\D+) (\d{2}:\d{2})/", $str2, $matches2);
print_r($matches);
print_r($matches2);
print "\n";
print $matches2[2] . " " . $matches2[1] . "\t" . $matches[2] . "\n";
print $matches2[4] . " " . $matches2[3] . "\n";
Dock hämtar jag dokumentet jag vill parsa från webben och tror att det kanske blir något knas med encoding där, för koden som inte fungerar ser ut så här: