private static function getData($serverData, $lang){ try{ $stops = array(); $html = str_get_html($serverData); $nodes = $html->find("tr.rowHeightTraject"); $i = 0; foreach ($nodes as $node) { $row_delay = str_replace("'",'',str_replace('+','',trim($node->children(3)->first_child()->plaintext))); if (isset($row_delay)) { $arr= array(); $arr = explode(":",$row_delay); if(isset($arr[1])){ $delay = (60*$arr[0] + $arr[1])*60; }else{ $delay = $row_delay * 60; } } else { $delay = 0; } $stops[$i] = new Stop(); $stops[$i]->station = stations::getStationFromRTName($node->children(1)->first_child()->plaintext,$lang); $stops[$i]->delay = $delay; $stops[$i]->time = tools::transformTime("00d" . $node->children(2)->first_child()->plaintext . ":00", date("Ymd")); $i++; } return $stops; } catch(Exception $e){ throw new Exception($e->getMessage(), 500); } }
private static function getData($serverData, $lang){ try{ $stops = array(); //BEGIN: O 20:29 +8' <a.*? >(.*?)</a><br> //NORMAL: | 20:50 +9' <a href="/mobile/SearchStation.aspx?l=NL&s=1&sid=1265&tr=20:45-60&da=D&p=2">Zele</a><br> //AT: =>22:01 <a href="/mobile/SearchStation.aspx?l=NL&s=1&sid=318&tr=22:00-60&da=D&p=2">Denderleeuw</a></font><br> //BETWEEN: <font face="Arial">| 10:35</font><font color="Red"> +15'</font><font face="Arial"> <a href="/mobile/SearchStation.aspx?l=NL&s=1&sid=215&tr=10:45-60&da=D&p=2">Brussel-Centraal</a><br> // | 10:40<font color="Red"> +15'</font></font> <a href="/mobile/SearchStation.aspx?l=NL&s=1&sid=221&tr=10:45-60&da=D&p=2">Brussel-Noord</a><br> //END: O 23:28 <a href="/mobile/SearchStation.aspx?l=NL&s=1&sid=973&tr=23:15-60&da=D&p=2">Poperinge</a><br> preg_match_all("/(\d\d:\d\d).*?( \+(\d\d?(:?\d\d)?)'?)? <a href=\"\/mobile\/SearchStation.*?>(.*?)<\/a>/smi", $serverData, $matches); $delays = $matches[3]; $times = $matches[0]; $stationnames = $matches[5]; $i = 0; foreach ($stationnames as $st) { if (isset($delays[$i])) { $arr= array(); $arr = explode(":",$delays[$i]); if(isset($arr[1])){ $delay = (60*$arr[0] + $arr[1])*60; }else{ $delay = $delays[$i] * 60; } } else { $delay = 0; } $time = tools::transformTime("00d" . $times[$i] . ":00", date("Ymd")); $stops[$i] = new Stop(); $stops[$i]->station = stations::getStationFromRTName($st,$lang); $stops[$i]->delay = $delay; $stops[$i]->time = $time; $i++; } return $stops; } catch(Exception $e){ throw new Exception($e->getMessage(), 500); } }
public static function parseHafasXml($serverData, $lang) { $xml = new SimpleXMLElement($serverData); $connection = array(); $i = 0; //DEBUG: echo $serverData ; if (isset($xml->ConRes->ConnectionList->Connection)) { //get stations from & to once for all connections $fromstation = connections::getStationFromHafasLocation($xml->ConRes->ConnectionList->Connection[0]->Overview->Departure->BasicStop->Station['x'], $xml->ConRes->ConnectionList->Connection[0]->Overview->Departure->BasicStop->Station['y'], $lang); $tostation = connections::getStationFromHafasLocation($xml->ConRes->ConnectionList->Connection[0]->Overview->Arrival->BasicStop->Station['x'], $xml->ConRes->ConnectionList->Connection[0]->Overview->Arrival->BasicStop->Station['y'], $lang); foreach ($xml->ConRes->ConnectionList->Connection as $conn) { $connection[$i] = new Connection(); $connection[$i]->departure = new DepartureArrival(); $connection[$i]->arrival = new DepartureArrival(); $connection[$i]->duration = tools::transformDuration($conn->Overview->Duration->Time); $connection[$i]->departure->station = $fromstation; $connection[$i]->departure->time = tools::transformTime($conn->Overview->Departure->BasicStop->Dep->Time, $conn->Overview->Date); $connection[$i]->departure->platform = new Platform(); $connection[$i]->departure->direction = trim($conn->Overview->Departure->BasicStop->Dep->Platform->Text); $connection[$i]->departure->platform->name = trim($conn->Overview->Departure->BasicStop->Dep->Platform->Text); $connection[$i]->arrival->time = tools::transformTime($conn->Overview->Arrival->BasicStop->Arr->Time, $conn->Overview->Date); $connection[$i]->arrival->platform = new Platform(); $connection[$i]->arrival->platform->name = trim($conn->Overview->Arrival->BasicStop->Arr->Platform->Text); $connection[$i]->arrival->station = $tostation; //Delay and platform changes //TODO: get Delay from railtime instead - much better information $delay0 = 0; $delay1 = 0; $platformNormal0 = true; $platformNormal1 = true; if ($conn->RtStateList->RtState["value"] == "HAS_DELAYINFO") { $delay0 = tools::transformTime($conn->Overview->Departure->BasicStop->StopPrognosis->Dep->Time, $conn->Overview->Date) - $connection[$i]->departure->time; if ($delay0 < 0) { $delay0 = 0; } //echo "delay: " .$conn->Overview -> Departure -> BasicStop -> StopPrognosis -> Dep -> Time . "\n"; $delay1 = tools::transformTime($conn->Overview->Arrival->BasicStop->StopPrognosis->Arr->Time, $conn->Overview->Date) - $connection[$i]->arrival->time; if ($delay1 < 0) { $delay1 = 0; } if (isset($conn->Overview->Departure->BasicStop->StopPrognosis->Dep->Platform->Text)) { $platform0 = trim($conn->Overview->Departure->BasicStop->StopPrognosis->Dep->Platform->Text); $platformNormal0 = false; } if (isset($conn->Overview->Arrival->BasicStop->StopPrognosis->Arr->Platform->Text)) { $platform1 = trim($conn->Overview->Arrival->BasicStop->StopPrognosis->Arr->Platform->Text); $platformNormal1 = false; } } $connection[$i]->departure->delay = $delay0; $connection[$i]->departure->platform->normal = $platformNormal0; $connection[$i]->arrival->delay = $delay1; $connection[$i]->arrival->platform->normal = $platformNormal1; $trains = array(); $vias = array(); $directions = array(); $j = 0; $k = 0; $connectionindex = 0; //yay for spaghetti code. if (isset($conn->ConSectionList->ConSection)) { foreach ($conn->ConSectionList->ConSection as $connsection) { if (isset($connsection->Journey->JourneyAttributeList->JourneyAttribute)) { foreach ($connsection->Journey->JourneyAttributeList->JourneyAttribute as $att) { if ($att->Attribute["type"] == "NAME") { $trains[$j] = str_replace(" ", "", $att->Attribute->AttributeVariant->Text); $j++; } else { if ($att->Attribute["type"] == "DIRECTION") { $directions[$k] = stations::getStationFromName(trim($att->Attribute->AttributeVariant->Text), $lang); $k++; } } } if ($conn->Overview->Transfers > 0 && strcmp($connsection->Arrival->BasicStop->Station['name'], $conn->Overview->Arrival->BasicStop->Station['name']) != 0) { //current index for the train: j-1 $departDelay = 0; //Todo: NYImplemented $connarray = $conn->ConSectionList->ConSection; $departTime = tools::transformTime($connarray[$connectionindex + 1]->Departure->BasicStop->Dep->Time, $conn->Overview->Date); $departPlatform = trim($connarray[$connectionindex + 1]->Departure->BasicStop->Dep->Platform->Text); $arrivalTime = tools::transformTime($connsection->Arrival->BasicStop->Arr->Time, $conn->Overview->Date); $arrivalPlatform = trim($connsection->Arrival->BasicStop->Arr->Platform->Text); $arrivalDelay = 0; //Todo: NYImplemented $vias[$connectionindex] = new Via(); $vias[$connectionindex]->arrival = new ViaDepartureArrival(); $vias[$connectionindex]->arrival->time = $arrivalTime; $vias[$connectionindex]->arrival->platform = new Platform(); $vias[$connectionindex]->arrival->platform->name = $arrivalPlatform; $vias[$connectionindex]->arrival->platform->normal = 1; $vias[$connectionindex]->departure = new ViaDepartureArrival(); $vias[$connectionindex]->departure->time = $departTime; $vias[$connectionindex]->departure->platform = new Platform(); $vias[$connectionindex]->departure->platform->name = $departPlatform; $vias[$connectionindex]->departure->platform->normal = 1; $vias[$connectionindex]->timeBetween = $departTime - $arrivalTime; $vias[$connectionindex]->direction = $directions[$k - 1]; $vias[$connectionindex]->vehicle = "BE.NMBS." . $trains[$j - 1]; $vias[$connectionindex]->station = connections::getStationFromHafasLocation($connsection->Arrival->BasicStop->Station['x'], $connsection->Arrival->BasicStop->Station['y'], $lang); $connectionindex++; } } } if ($connectionindex != 0) { $connection[$i]->via = $vias; } } $connection[$i]->departure->vehicle = "BE.NMBS." . $trains[0]; $connection[$i]->departure->direction = $directions[0]; $connection[$i]->arrival->vehicle = "BE.NMBS." . $trains[sizeof($trains) - 1]; $connection[$i]->arrival->direction = $directions[sizeof($directions) - 1]; $i++; } } else { throw new Exception("We're sorry, we could not retrieve the correct data from our sources", 2); } return $connection; }
public static function parseHafasXml($serverData, $lang, $fast, $showAlerts = false) { $xml = new SimpleXMLElement($serverData); $connection = []; $i = 0; if (isset($xml->ConRes->ConnectionList->Connection)) { $fromstation = self::getStationFromHafasDescription($xml->ConRes->ConnectionList->Connection[0]->Overview->Departure->BasicStop->Station['name'], $xml->ConRes->ConnectionList->Connection[0]->Overview->Departure->BasicStop->Station['x'], $xml->ConRes->ConnectionList->Connection[0]->Overview->Departure->BasicStop->Station['y'], $lang); $tostation = self::getStationFromHafasDescription($xml->ConRes->ConnectionList->Connection[0]->Overview->Arrival->BasicStop->Station['name'], $xml->ConRes->ConnectionList->Connection[0]->Overview->Arrival->BasicStop->Station['x'], $xml->ConRes->ConnectionList->Connection[0]->Overview->Arrival->BasicStop->Station['y'], $lang); foreach ($xml->ConRes->ConnectionList->Connection as $conn) { $connection[$i] = new Connection(); $connection[$i]->duration = tools::transformDuration($conn->Overview->Duration->Time); $connection[$i]->departure = new DepartureArrival(); $connection[$i]->departure->station = $fromstation; $connection[$i]->departure->direction = trim($conn->Overview->Departure->BasicStop->Dep->Platform->Text); $connection[$i]->departure->time = tools::transformTime($conn->Overview->Departure->BasicStop->Dep->Time, $conn->Overview->Date); $connection[$i]->departure->canceled = $conn->Overview->Departure->BasicStop->StopPrognosis->Status != "SCHEDULED" ? true : false; $connection[$i]->arrival = new DepartureArrival(); $connection[$i]->arrival->station = $tostation; $connection[$i]->arrival->time = tools::transformTime($conn->Overview->Arrival->BasicStop->Arr->Time, $conn->Overview->Date); $connection[$i]->arrival->canceled = $conn->Overview->Arrival->BasicStop->StopPrognosis->Status != "SCHEDULED" ? true : false; //Delay and platform changes $departureDelay = 0; $departurePlatform = trim($conn->Overview->Departure->BasicStop->Dep->Platform->Text); $departurePlatformNormal = true; $arrivalDelay = 0; $arrivalPlatform = trim($conn->Overview->Arrival->BasicStop->Arr->Platform->Text); $arrivalPlatformNormal = true; if ($conn->RtStateList->RtState['value'] == 'HAS_DELAYINFO') { //echo "delay: " .$conn->Overview -> Departure -> BasicStop -> StopPrognosis -> Dep -> Time . "\n"; $departureDelay = tools::transformTime($conn->Overview->Departure->BasicStop->StopPrognosis->Dep->Time, $conn->Overview->Date) - $connection[$i]->departure->time; if ($departureDelay < 0) { $departureDelay = 0; } $arrivalDelay = tools::transformTime($conn->Overview->Arrival->BasicStop->StopPrognosis->Arr->Time, $conn->Overview->Date) - $connection[$i]->arrival->time; if ($arrivalDelay < 0) { $arrivalDelay = 0; } if (isset($conn->Overview->Departure->BasicStop->StopPrognosis->Dep->Platform->Text)) { $departurePlatform = trim($conn->Overview->Departure->BasicStop->StopPrognosis->Dep->Platform->Text); $departurePlatformNormal = false; } if (isset($conn->Overview->Arrival->BasicStop->StopPrognosis->Arr->Platform->Text)) { $arrivalPlatform = trim($conn->Overview->Arrival->BasicStop->StopPrognosis->Arr->Platform->Text); $arrivalPlatformNormal = false; } } // Alerts if ($showAlerts && isset($conn->IList)) { $alerts = []; foreach ($conn->IList->I as $info) { $alert = new Alert(); $alert->header = htmlentities(trim($info['header'])); $alert->description = htmlentities(trim($info['text'])); array_push($alerts, $alert); } $connection[$i]->alert = $alerts; } $connection[$i]->departure->delay = $departureDelay; $connection[$i]->departure->platform = new Platform(); $connection[$i]->departure->platform->name = $departurePlatform; $connection[$i]->departure->platform->normal = $departurePlatformNormal; $connection[$i]->arrival->delay = $arrivalDelay; $connection[$i]->arrival->platform = new Platform(); $connection[$i]->arrival->platform->name = $arrivalPlatform; $connection[$i]->arrival->platform->normal = $arrivalPlatformNormal; $trains = []; $vias = []; $directions = []; $j = 0; $k = 0; $connectionindex = 0; if (isset($conn->ConSectionList->ConSection)) { foreach ($conn->ConSectionList->ConSection as $connsection) { if (isset($connsection->Journey->JourneyAttributeList->JourneyAttribute)) { foreach ($connsection->Journey->JourneyAttributeList->JourneyAttribute as $att) { if ($att->Attribute['type'] == 'NAME') { $trains[$j] = str_replace(' ', '', $att->Attribute->AttributeVariant->Text); $j++; } elseif ($att->Attribute['type'] == 'DIRECTION') { $__stat = new stdClass(); //This recently changed: only fetch direction name, nothing else. $__stat->name = str_replace(' [NMBS/SNCB]', '', trim($att->Attribute->AttributeVariant->Text)); $directions[$k] = $__stat; $k++; } } if ($conn->Overview->Transfers > 0 && strcmp($connsection->Arrival->BasicStop->Station['name'], $conn->Overview->Arrival->BasicStop->Station['name']) != 0) { //current index for the train: j-1 $connarray = $conn->ConSectionList->ConSection; $departTime = tools::transformTime($connarray[$connectionindex + 1]->Departure->BasicStop->Dep->Time, $conn->Overview->Date); $departPlatform = trim($connarray[$connectionindex + 1]->Departure->BasicStop->Dep->Platform->Text); $departDelay = 0; //Todo: NYImplemented $departcanceled = $connarray[$connectionindex + 1]->Departure->BasicStop->StopPrognosis->Status != "SCHEDULED" ? true : false; $arrivalTime = tools::transformTime($connsection->Arrival->BasicStop->Arr->Time, $conn->Overview->Date); $arrivalPlatform = trim($connsection->Arrival->BasicStop->Arr->Platform->Text); $arrivalDelay = 0; //Todo: NYImplemented $arrivalcanceled = $connarray[$connectionindex + 1]->Arrival->BasicStop->StopPrognosis->Status != "SCHEDULED" ? true : false; $vias[$connectionindex] = new Via(); $vias[$connectionindex]->arrival = new ViaDepartureArrival(); $vias[$connectionindex]->arrival->time = $arrivalTime; $vias[$connectionindex]->arrival->platform = new Platform(); $vias[$connectionindex]->arrival->platform->name = $arrivalPlatform; $vias[$connectionindex]->arrival->platform->normal = 1; $vias[$connectionindex]->arrival->canceled = $arrivalcanceled; $vias[$connectionindex]->departure = new ViaDepartureArrival(); $vias[$connectionindex]->departure->time = $departTime; $vias[$connectionindex]->departure->platform = new Platform(); $vias[$connectionindex]->departure->platform->name = $departPlatform; $vias[$connectionindex]->departure->platform->normal = 1; $vias[$connectionindex]->departure->canceled = $departcanceled; $vias[$connectionindex]->timeBetween = $departTime - $arrivalTime; if (isset($directions[$k - 1])) { $vias[$connectionindex]->direction = $directions[$k - 1]; } else { $vias[$connectionindex]->direction = 'unknown'; } $vias[$connectionindex]->vehicle = 'BE.NMBS.' . $trains[$j - 1]; $vias[$connectionindex]->station = self::getStationFromHafasDescription($connsection->Arrival->BasicStop->Station['name'], $connsection->Arrival->BasicStop->Station['x'], $connsection->Arrival->BasicStop->Station['y'], $lang); $connectionindex++; } } } //check if there were vias at all if ($connectionindex != 0) { //if there were vias, add them to the array $connection[$i]->via = $vias; } } $connection[$i]->departure->vehicle = 'BE.NMBS.' . $trains[0]; if (isset($directions[0])) { $connection[$i]->departure->direction = $directions[0]; } else { $connection[$i]->departure->direction = 'unknown'; } $connection[$i]->arrival->vehicle = 'BE.NMBS.' . $trains[count($trains) - 1]; if (isset($directions[count($directions) - 1])) { $connection[$i]->arrival->direction = $directions[count($directions) - 1]; } else { $connection[$i]->arrival->direction = 'unknown'; } $i++; } } else { throw new Exception("We're sorry, we could not retrieve the correct data from our sources", 500); } return $connection; }
/** * @param $html * @param $lang * @param $fast * @return array * @throws Exception */ private static function getData($html, $lang, $fast) { try { $stops = []; $nodes = $html->getElementById('tq_trainroute_content_table_alteAnsicht')->getElementByTagName('table')->children; $j = 0; for ($i = 1; $i < count($nodes); $i++) { $node = $nodes[$i]; if (!count($node->attr)) { continue; } // row with no class-attribute contain no data // Delay and canceled $splitter = '***'; $delaycontent = preg_replace("/<br\\W*?\\/>/", $splitter, $node->children[2]); $delayelements = explode($splitter, strip_tags($delaycontent)); // print_r($delayelements); $arrivalDelay = trim($delayelements[0]); $arrivalCanceled = false; if (!$arrivalDelay) { $arrivalDelay = 0; } elseif (stripos($arrivalDelay, '+') !== false) { $arrivalDelay = preg_replace('/[^0-9]/', '', $arrivalDelay) * 60; } else { $arrivalDelay = 0; $arrivalCanceled = true; } $departureDelay = trim($delayelements[1]); $departureCanceled = false; if (!$departureDelay) { $departureDelay = $arrivalDelay ? $arrivalDelay : 0; } elseif (stripos($departureDelay, '+') !== false) { $departureDelay = preg_replace('/[^0-9]/', '', $departureDelay) * 60; } else { $departureDelay = 0; $departureCanceled = true; } // Time $timenodearray = $node->children[1]->find('span'); $arriveTime = reset($timenodearray[0]->nodes[0]->_); $departureTime = count($nodes[$i]->children[1]->children) == 3 ? reset($nodes[$i]->children[1]->children[2]->nodes[0]->_) : $arriveTime; if (count($node->children[3]->find('a'))) { $as = $node->children[3]->find('a'); $stationname = reset($as[0]->nodes[0]->_); } else { $stationname = reset($node->children[3]->nodes[0]->_); } // Platform $platformnodearray = $node->children[5]->find('span'); if (count($platformnodearray) > 0) { $normalplatform = 0; $platform = trim(reset($platformnodearray[0]->nodes[0]->_)); } else { $normalplatform = 1; $platform = trim(reset($node->children[5]->nodes[0]->_)); } if ($platform == " ") { $platform = '?'; // Indicate to end user platform is unknown } if (isset($node->children[3]->children[0])) { $link = $node->children[3]->children[0]->{'attr'}['href']; // With capital S if (strpos($link, 'StationId=')) { $nr = substr($link, strpos($link, 'StationId=') + strlen('StationId=')); } else { $nr = substr($link, strpos($link, 'stationId=') + strlen('stationId=')); } $nr = substr($nr, 0, strlen($nr) - 1); // delete ampersand on the end $stationId = '00' . $nr; } $station = new Station(); if ($fast == 'true') { $station->name = $stationname; if ($stationId) { $station->id = "BE.NMBS." . $stationId; } } else { // Station ID can be parsed from the station URL if ($stationId) { $station = stations::getStationFromID($stationId, $lang); } else { $station = stations::getStationFromName($stationname, $lang); } } $stops[$j] = new Stop(); $stops[$j]->station = $station; $stops[$j]->delay = $departureDelay; $stops[$j]->canceled = $departureCanceled; $stops[$j]->time = tools::transformTime('00d' . $departureTime . ':00', date('Ymd')); $stops[$j]->platform = new Platform(); $stops[$j]->platform->name = $platform; $stops[$j]->platform->normal = $normalplatform; $j++; } return $stops; } catch (Exception $e) { throw new Exception($e->getMessage(), 500); } }
/** * @param $serverData * @param $lang * @param $fast * @return array * @throws Exception */ private static function getData($serverData, $lang, $fast) { try { $stops = []; $html = str_get_html($serverData); $nodes = $html->getElementById('tq_trainroute_content_table_alteAnsicht')->getElementByTagName('table')->children; $j = 0; for ($i = 1; $i < count($nodes); $i++) { $node = $nodes[$i]; if (!count($node->attr)) { continue; } // row with no class-attribute contain no data $delaynodearray = $node->children[2]->find('span'); $delay = count($delaynodearray) > 0 ? trim(reset($delaynodearray[0]->nodes[0]->_)) : "0"; $delayseconds = preg_replace("/[^0-9]/", '', $delay) * 60; $spans = $node->children[1]->find('span'); $arriveTime = reset($spans[0]->nodes[0]->_); $departureTime = count($nodes[$i]->children[1]->children) == 3 ? reset($nodes[$i]->children[1]->children[0]->nodes[0]->_) : $arriveTime; if (count($node->children[3]->find('a'))) { $as = $node->children[3]->find('a'); $stationname = reset($as[0]->nodes[0]->_); } else { $stationname = reset($node->children[3]->nodes[0]->_); } $stops[$j] = new Stop(); $station = new Station(); if ($fast == "true") { $station->name = $stationname; } else { $station = stations::getStationFromName($stationname, $lang); } $stops[$j]->station = $station; $stops[$j]->delay = $delayseconds; $stops[$j]->time = tools::transformTime("00d" . $departureTime . ":00", date("Ymd")); $j++; } return $stops; } catch (Exception $e) { throw new Exception($e->getMessage(), 500); } }
private static function parseData($html, $time, $lang) { $hour = substr($time, 0, 2); preg_match_all("/<tr>(.*?)<\\/tr>/ism", $html, $m); $nodes = array(); $i = 0; //for each row foreach ($m[1] as $tr) { preg_match("/<td valign=\"top\">(.*?)<\\/td><td valign=\"top\">(.*?)<\\/td>/ism", $tr, $m2); //$m2[1] has: time //$m2[2] has delay, stationname & platform //GET LEFT OR NOT $left = 0; if (preg_match("/color=\"DarkGray\"/ism", $tr, $lll) > 0) { $left = 1; } //GET TIME: preg_match("/((\\d\\d):\\d\\d)/", $m2[1], $t); //if it is 23 pm and we fetched data for 1 hour, we may end up with data for the next day and thus we will need to add a day $dayoffset = 0; if ($t[2] != 23 && $hour == 23) { $dayoffset = 1; } $time = "0" . $dayoffset . "d" . $t[1] . ":00"; $dateparam = date("ymd"); //day is previous day if time is before 4 O clock (NMBS-ish thing) if (date('G') < 4) { $dateparam = date("ymd", strtotime("-1 day")); } $unixtime = tools::transformTime($time, "20" . $dateparam); //GET DELAY $delay = 0; preg_match("/\\+(\\d+)'/", $m2[2], $d); if (isset($d[1])) { $delay = $d[1] * 60; } preg_match("/\\+(\\d):(\\d+)/", $m2[2], $d); if (isset($d[1])) { $delay = $d[1] * 3600 + $d[2] * 60; } //GET STATION preg_match("/.* (.*?) <span/", $m2[2], $st); //echo $st[1] . "\n"; $st = explode("/", $st[1]); $st = trim($st[0]); try { $stationNode = stations::getStationFromRTName(strtoupper($st), $lang); } catch (Exception $e) { //fallback: if no railtime name is available, let's ask HAFAS to solve this issue for us $stationNode = stations::getStationFromName($st, $lang); } //GET VEHICLE AND PLATFORM $platform = ""; $platformNormal = true; preg_match("/\\[(.*?)( .*?)?\\]/", $m2[2], $veh); $vehicle = "BE.NMBS." . $veh[1]; if (isset($veh[2])) { if (preg_match("/<[bf].*?>(.*?)<\\/.*?>/", $veh[2], $p)) { $platform = $p[1]; $platformNormal = false; } else { //echo $veh[2] . "\n"; preg_match("/ .*? (.*)/", $veh[2], $p2); if (isset($p2[1])) { $platform = $p2[1]; } } } $nodes[$i] = new DepartureArrival(); $nodes[$i]->delay = $delay; $nodes[$i]->station = $stationNode; $nodes[$i]->time = $unixtime; $nodes[$i]->vehicle = $vehicle; $nodes[$i]->platform = new Platform(); $nodes[$i]->platform->name = $platform; $nodes[$i]->platform->normal = $platformNormal; $nodes[$i]->left = $left; $i++; } return liveboard::removeDuplicates($nodes); }
public static function parseHafasXml($serverData, $lang, $fast) { $xml = new SimpleXMLElement($serverData); $connection = []; $i = 0; //DEBUG: //echo $serverData ; if (isset($xml->ConRes->ConnectionList->Connection)) { //get stations from & to once for all connections $fromstation = connections::getStationFromHafasDescription($xml->ConRes->ConnectionList->Connection[0]->Overview->Departure->BasicStop->Station['name'], $xml->ConRes->ConnectionList->Connection[0]->Overview->Departure->BasicStop->Station['x'], $xml->ConRes->ConnectionList->Connection[0]->Overview->Departure->BasicStop->Station['y'], $lang); $tostation = connections::getStationFromHafasDescription($xml->ConRes->ConnectionList->Connection[0]->Overview->Arrival->BasicStop->Station['name'], $xml->ConRes->ConnectionList->Connection[0]->Overview->Arrival->BasicStop->Station['x'], $xml->ConRes->ConnectionList->Connection[0]->Overview->Arrival->BasicStop->Station['y'], $lang); foreach ($xml->ConRes->ConnectionList->Connection as $conn) { $connection[$i] = new Connection(); $connection[$i]->departure = new DepartureArrival(); $connection[$i]->arrival = new DepartureArrival(); $connection[$i]->duration = tools::transformDuration($conn->Overview->Duration->Time); $connection[$i]->departure->station = $fromstation; $connection[$i]->departure->time = tools::transformTime($conn->Overview->Departure->BasicStop->Dep->Time, $conn->Overview->Date); $connection[$i]->departure->platform = new Platform(); $connection[$i]->departure->direction = trim($conn->Overview->Departure->BasicStop->Dep->Platform->Text); $connection[$i]->departure->platform->name = trim($conn->Overview->Departure->BasicStop->Dep->Platform->Text); $connection[$i]->arrival->time = tools::transformTime($conn->Overview->Arrival->BasicStop->Arr->Time, $conn->Overview->Date); $connection[$i]->arrival->platform = new Platform(); $connection[$i]->arrival->platform->name = trim($conn->Overview->Arrival->BasicStop->Arr->Platform->Text); $connection[$i]->arrival->station = $tostation; //Delay and platform changes //TODO: get Delay from railtime instead - much better information $delay0 = 0; $delay1 = 0; $platformNormal0 = true; $platformNormal1 = true; if ($conn->RtStateList->RtState["value"] == "HAS_DELAYINFO") { $delay0 = tools::transformTime($conn->Overview->Departure->BasicStop->StopPrognosis->Dep->Time, $conn->Overview->Date) - $connection[$i]->departure->time; if ($delay0 < 0) { $delay0 = 0; } //echo "delay: " .$conn->Overview -> Departure -> BasicStop -> StopPrognosis -> Dep -> Time . "\n"; $delay1 = tools::transformTime($conn->Overview->Arrival->BasicStop->StopPrognosis->Arr->Time, $conn->Overview->Date) - $connection[$i]->arrival->time; if ($delay1 < 0) { $delay1 = 0; } if (isset($conn->Overview->Departure->BasicStop->StopPrognosis->Dep->Platform->Text)) { $platform0 = trim($conn->Overview->Departure->BasicStop->StopPrognosis->Dep->Platform->Text); $platformNormal0 = false; } if (isset($conn->Overview->Arrival->BasicStop->StopPrognosis->Arr->Platform->Text)) { $platform1 = trim($conn->Overview->Arrival->BasicStop->StopPrognosis->Arr->Platform->Text); $platformNormal1 = false; } } $connection[$i]->departure->delay = $delay0; $connection[$i]->departure->platform->normal = $platformNormal0; $connection[$i]->arrival->delay = $delay1; $connection[$i]->arrival->platform->normal = $platformNormal1; $trains = []; $vias = []; $directions = []; $j = 0; $k = 0; $connectionindex = 0; //yay for spaghetti code. if (isset($conn->ConSectionList->ConSection)) { foreach ($conn->ConSectionList->ConSection as $connsection) { if (isset($connsection->Journey->JourneyAttributeList->JourneyAttribute)) { foreach ($connsection->Journey->JourneyAttributeList->JourneyAttribute as $att) { if ($att->Attribute["type"] == "NAME") { $trains[$j] = str_replace(" ", "", $att->Attribute->AttributeVariant->Text); $j++; } elseif ($att->Attribute["type"] == "DIRECTION") { $__stat = new stdClass(); //This recently changed: only fetch direction name, nothing else. $__stat->name = str_replace(" [NMBS/SNCB]", "", trim($att->Attribute->AttributeVariant->Text)); $directions[$k] = $__stat; $k++; } } if ($conn->Overview->Transfers > 0 && strcmp($connsection->Arrival->BasicStop->Station['name'], $conn->Overview->Arrival->BasicStop->Station['name']) != 0) { //current index for the train: j-1 $departDelay = 0; //Todo: NYImplemented $connarray = $conn->ConSectionList->ConSection; $departTime = tools::transformTime($connarray[$connectionindex + 1]->Departure->BasicStop->Dep->Time, $conn->Overview->Date); $departPlatform = trim($connarray[$connectionindex + 1]->Departure->BasicStop->Dep->Platform->Text); $arrivalTime = tools::transformTime($connsection->Arrival->BasicStop->Arr->Time, $conn->Overview->Date); $arrivalPlatform = trim($connsection->Arrival->BasicStop->Arr->Platform->Text); $arrivalDelay = 0; //Todo: NYImplemented $vias[$connectionindex] = new Via(); $vias[$connectionindex]->arrival = new ViaDepartureArrival(); $vias[$connectionindex]->arrival->time = $arrivalTime; $vias[$connectionindex]->arrival->platform = new Platform(); $vias[$connectionindex]->arrival->platform->name = $arrivalPlatform; $vias[$connectionindex]->arrival->platform->normal = 1; $vias[$connectionindex]->departure = new ViaDepartureArrival(); $vias[$connectionindex]->departure->time = $departTime; $vias[$connectionindex]->departure->platform = new Platform(); $vias[$connectionindex]->departure->platform->name = $departPlatform; $vias[$connectionindex]->departure->platform->normal = 1; $vias[$connectionindex]->timeBetween = $departTime - $arrivalTime; if (isset($directions[$k - 1])) { $vias[$connectionindex]->direction = $directions[$k - 1]; } else { $vias[$connectionindex]->direction = "unknown"; } $vias[$connectionindex]->vehicle = "BE.NMBS." . $trains[$j - 1]; $vias[$connectionindex]->station = connections::getStationFromHafasDescription($connsection->Arrival->BasicStop->Station['name'], $connsection->Arrival->BasicStop->Station['x'], $connsection->Arrival->BasicStop->Station['y'], $lang); $connectionindex++; } } } //check if there were vias at all if ($connectionindex != 0) { //if there were, lets calculate a URI for them $counter = 0; for ($counter = 1; $counter < sizeof($directions); $counter++) { if (isset($trains[$counter]) && isset($directions[$counter]) && isset($vias[$counter])) { $vias[$counter - 1]->departure->{"@id"} = connections::createDepartureURI($vias[$counter - 1]->station->{"@id"}, $trains[$counter], $directions[$counter]->name, $vias[$counter]->departure->time); } } //if there were vias, add them to the array $connection[$i]->via = $vias; } } $connection[$i]->departure->vehicle = "BE.NMBS." . $trains[0]; if (isset($directions[0])) { $connection[$i]->departure->direction = $directions[0]; $connection[$i]->departure->{"@id"} = connections::createDepartureURI($fromstation->{"@id"}, $trains[0], $directions[0]->name, $connection[$i]->departure->time); } else { $connection[$i]->departure->direction = "unknown"; } $connection[$i]->arrival->vehicle = "BE.NMBS." . $trains[sizeof($trains) - 1]; if (isset($directions[sizeof($directions) - 1])) { $connection[$i]->arrival->direction = $directions[sizeof($directions) - 1]; } else { $connection[$i]->arrival->direction = "unknown"; } $i++; } } else { throw new Exception("We're sorry, we could not retrieve the correct data from our sources", 2); } return $connection; }
private static function parseData($html, $time, $lang) { $hour = substr($time, 0, 2); preg_match_all("/<table class=\"StationList\">(.*?)<\\/table>/ism", $html, $m); $nodes = array(); $i = 0; //for each row foreach ($m[0] as $table) { $left = 0; preg_match_all("/<tr class=(.*?)>(.*?)<\\/tr>/ism", $table, $m2); if ($m2[1][0] == "rowStation trainLeft") { $left = 1; } preg_match_all("/<label>(.*?)<\\/label>/ism", $m2[2][0], $m3); //$m3[1][0] has : time //$m3[1][1] has : stationname preg_match_all("/<label class=\"orange\">(.*?)<\\/label>/ism", $m2[2][0], $delay); preg_match_all("/<label class=\"bold\">(.*?)<\\/label>/ism", $m2[2][0], $platform); preg_match_all("/<a class=\"button cmd blue\" href=(.*?)>><\\/a>/ism", $m2[2][0], $id); $delay = $delay[1][0]; $platform = $platform[1][0]; $id = $id[1][0]; //GET TIME: preg_match("/((\\d\\d):\\d\\d)/", $m3[1][0], $t); //if it is 23 pm and we fetched data for 1 hour, we may end up with data for the next day and thus we will need to add a day $dayoffset = 0; if ($t[2] != 23 && $hour == 23) { $dayoffset = 1; } $time = "0" . $dayoffset . "d" . $t[1] . ":00"; $dateparam = date("ymd"); //day is previous day if time is before 4 O clock (NMBS-ish thing) if (date('G') < 4) { $dateparam = date("ymd", strtotime("-1 day")); } $unixtime = tools::transformTime($time, "20" . $dateparam); //GET DELAY preg_match("/\\+(\\d+)'/", $delay, $d); if (isset($d[1])) { $delay = $d[1] * 60; } preg_match("/\\+(\\d):(\\d+)/", $delay, $d); if (isset($d[1])) { $delay = $d[1] * 3600 + $d[2] * 60; } //GET STATION $st = trim(utf8_encode($m3[1][1])); try { $stationNode = stations::getStationFromRTName(strtoupper($st), $lang); } catch (Exception $e) { //fallback: if no railtime name is available, let's ask HAFAS to solve this issue for us $stationNode = stations::getStationFromName($st, $lang); } //GET VEHICLE AND PLATFORM $platformNormal = true; $veh = explode(";", $id); $veh = explode("=", $veh[2]); $vehicle = "BE.NMBS." . str_replace("&", "", $veh[1]); $nodes[$i] = new DepartureArrival(); $nodes[$i]->delay = $delay; $nodes[$i]->station = $stationNode; $nodes[$i]->time = $unixtime; $nodes[$i]->vehicle = $vehicle; $nodes[$i]->platform = new Platform(); $nodes[$i]->platform->name = $platform; $nodes[$i]->platform->normal = $platformNormal; $nodes[$i]->left = $left; $i++; } return liveboard::removeDuplicates($nodes); }