Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]preg_match_all - problem
Forum PHP.pl > Forum > Przedszkole
casperii
panowie , przejdę od razu do rzeczy, kod:

  1. public function __construct($url = 'http://api.nbp.pl/api/exchangerates/tables/A/2020-04-02')
  2. {
  3. $this->_url = $url;
  4. }
  5.  
  6.  
  7. $html = file_get_contents($this->_url . '');
  8. $pattern = '/\/tables\/A\/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/';
  9. preg_match_all($pattern, $html, $matches);
  10. if (!isset($matches[0][0])) {
  11. throw new Exception('Unable to find XML filepath!');
  12. }
  13.  
  14. $xml = file_get_contents($this->_url . $matches[0][0]);
  15. if (!file_exists($this->_cache)) {
  16. if (!mkdir($this->_cache)) {
  17. throw new Exception('Unable to create cache directory!');
  18. }
  19. }
  20. if (!file_put_contents($filepath, $xml)) {
  21. throw new Exception('Unable to save file in cache directory!');
  22. }
  23. return $xml;


Niestety zwraca throwa Unable to find XML filepath , ktoś podpowie ? Chodzi o pobranie "2020-04-02" i zapisanie w katalogu na ftp.
nospor
A co to niby jest o to na poczatku:
/tables\/A
?
viking
A czemu po ludzku się do tego nie dobierzezz zwłaszcza że api nbp zwraca też json.
casperii
w sumie to na początku nie jest potrzebne, ale dalej jak najbardziej musi być gdyż wywala błąd: Delimiter must not be alphanumeric or backslash, a jsona nie będę przerabiać, bo za dużo musiałbym przepisywać obecną funkcję , która szła bez api. Pobera XMLa na FTP - jeśli nie ma na serwerze , jeśli jest to wczytuje dane z xml'a
Lord
Cytat(casperii @ 2.04.2020, 16:43:02 ) *
w sumie to na początku nie jest potrzebne, ale dalej jak najbardziej musi być gdyż wywala błąd: Delimiter must not be alphanumeric or backslash, a jsona nie będę przerabiać, bo za dużo musiałbym przepisywać obecną funkcję , która szła bez api. Pobera XMLa na FTP - jeśli nie ma na serwerze , jeśli jest to wczytuje dane z xml'a

A co chcesz przerabiać w JSON? chyba i tak chcesz mieć tablice wiec w czym problem ?
casperii
nie chcę JSONA , chodziło mi o to , że nie chcę już przerabiać istniejącego oskryptowania , które działa na pobranym XMLu,
dane wyciągam np w ten sposób: $euro = $nbp->getEuro();
viking
Niesamowite. Kod na odwal się żeby zachować kompatybilność ma mniej linii niż Twój do ustalenia daty.

  1. final class Nbp {
  2. private array $data;
  3. private array $transformedData;
  4. private array $mappings = [
  5. 'Euro' => 'EUR',
  6. 'Dolar' => 'USD',
  7. 'Frank' => 'CHF',
  8. ];
  9.  
  10. public function __construct(array $data) {
  11. $this->data = $data;
  12. $this->transformData();
  13. }
  14.  
  15. public function getEffectiveDate(): string {
  16. return $this->data[0]['effectiveDate'];
  17. }
  18.  
  19. private function transformData(): void {
  20. $this->transformedData = array_column($this->data[0]['rates'], 'mid', 'code');
  21. }
  22.  
  23. private function searchMappings($name): ?string {
  24. $currency = substr($name, 3, strlen($name));
  25. return $this->mappings[$currency] ?? null;
  26. }
  27.  
  28. public function __call($name, $arguments): ?string {
  29. return $this->transformedData[$this->searchMappings($name)] ?? null;
  30. }
  31. }
  32.  
  33. $nbp = new Nbp(json_decode($data, true));
  34. echo $nbp->getEuro();
  35. echo $nbp->getEffectiveDate();
casperii
@viking ale nie widzę, byś zapisywał swoją klasą na serwerze, czyli każde F5 odpytuje nbp ? Według tego co NBP napisał w regulaminie - zbyt duża ilość odpytek z IP - może spowodować tymczasowego bana.

Na chwilę obecną plik mi się zapisuje na serwerze , ale w formacie json, chociaż pobieram xml - podpowiesz czemu ?

I jeszcze jak rozwiązałeś u siebie sposób z pobieraniem aktualnego kursu po północy? gdzie data już jest +1 , ale dane w NBP pojawiają się do godz 11 następnego dnia.
czyli jutro dane zostaną wyświetlone na stronie nbp dopiero około 10 - 11 a wejście w poniższy link spowoduje zwrócenie brak danych.
http://api.nbp.pl/api/exchangerates/tables/A/2020-04-04
viking
Cache to nie odpowiedzialność tej klasy tylko czegoś implementującego PSR-16. Na brak danych zwracają 404 w nagłówku więc też nie widzę problemu.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.