Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]preg_match_all - problem
casperii
post 2.04.2020, 15:12:10
Post #1





Grupa: Zarejestrowani
Postów: 680
Pomógł: 28
Dołączył: 14.08.2014

Ostrzeżenie: (0%)
-----


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.

Ten post edytował casperii 2.04.2020, 15:14:30
Go to the top of the page
+Quote Post
nospor
post 2.04.2020, 15:32:40
Post #2





Grupa: Moderatorzy
Postów: 36 447
Pomógł: 6292
Dołączył: 27.12.2004




A co to niby jest o to na poczatku:
/tables\/A
?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
viking
post 2.04.2020, 15:41:50
Post #3





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


A czemu po ludzku się do tego nie dobierzezz zwłaszcza że api nbp zwraca też json.


--------------------
Go to the top of the page
+Quote Post
casperii
post 2.04.2020, 15:43:02
Post #4





Grupa: Zarejestrowani
Postów: 680
Pomógł: 28
Dołączył: 14.08.2014

Ostrzeżenie: (0%)
-----


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

Ten post edytował casperii 2.04.2020, 15:45:25
Go to the top of the page
+Quote Post
Lord
post 2.04.2020, 15:48:40
Post #5





Grupa: Zarejestrowani
Postów: 239
Pomógł: 32
Dołączył: 10.03.2004

Ostrzeżenie: (10%)
X----


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 ?

Ten post edytował Lord 2.04.2020, 15:52:31
Go to the top of the page
+Quote Post
casperii
post 2.04.2020, 15:54:18
Post #6





Grupa: Zarejestrowani
Postów: 680
Pomógł: 28
Dołączył: 14.08.2014

Ostrzeżenie: (0%)
-----


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();
Go to the top of the page
+Quote Post
viking
post 2.04.2020, 19:58:58
Post #7





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


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();


Ten post edytował viking 2.04.2020, 19:59:34


--------------------
Go to the top of the page
+Quote Post
casperii
post 3.04.2020, 07:21:21
Post #8





Grupa: Zarejestrowani
Postów: 680
Pomógł: 28
Dołączył: 14.08.2014

Ostrzeżenie: (0%)
-----


@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

Ten post edytował casperii 3.04.2020, 07:27:24
Go to the top of the page
+Quote Post
viking
post 3.04.2020, 07:35:35
Post #9





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.04.2024 - 18:32