Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Parsowanie tablicy JS
Forum PHP.pl > Forum > PHP
markonix
Transferuj.pl umożliwia pobranie wszystkich kanałów za pomocą pliku JS o strukturze:

  1. /**
  2.  * JavaScript channel selection
  3.  *
  4.  * @author Transferuj.pl
  5.  * @version 1.0
  6.  *
  7. */
  8. var tr_channels = Array();
  9. tr_channels[0] = ['18','mBank','1','https://secure.transferuj.pl/images/kanaly/e_mbank.png','00:00-24:00'];
  10. tr_channels[1] = ['13','ING Bank Śląski SA','1','https://secure.transferuj.pl/images/kanaly/ing.png','00:00-24:00'];
  11. tr_channels[2] = ['14','Inteligo','1','https://secure.transferuj.pl/images/kanaly/inteligo.png','00:00-24:00'];
  12. [...]


Dzięki temu pliku można sobie ładnie zbudować listę kanałów na swojej stronie jednakże chciałbym uniknąć budowania tego w oparciu o JS.
Zastanawiam się jakie są możliwości przekształcenia tablicy JS w PHP.

Pobranie zawartości pliku - file_get_contents.
Ale co dalej? Ma ktoś jakieś ciekawe rozwiązanie czy zostają tylko wyrażenia regularne albo linia za linią i wyłuskiwanie tych danych?
darko
json_decode
markonix
Czy json_decode działa z normalnymi tablicami JS?
Bo z mojej wiedzy i manualna wynika, że nie.
darko
Skonwertuj sobie (nie sprawdzałem czy działa, a jak nie chcesz w ten sposób, to jest darmowa biblioteka do pobrania
markonix
Przecież to są rozwiązania w JS więc co mi z nich?
tehaha
napisz dokładnie co chcesz zrobić, to wtedy będzie można zasugerować jakieś rozwiązanie, bo możesz np. przy pomocy jQuery przesłać sobie do php tablicę w formacie JSON, możesz też użyć regexp'a do przekonwertowania bezpośrednio pliku na tablicę php
markonix
Jeżeli napisałem, że nie chce wykorzystywać JS to oznacza, że jQuery też..
Jakby było inaczej to bym o tym nie wspominał i nie umieszczał tematu w PHP..
Nie rozumiem co jest niezrozumiałego w temacie - tablica JS w tablicę PHP przy użyciu samego PHP.

Jeżeli chodzi o JSON to na razie doszedłem, że musiałoby przejść transformacje takową:

  1. tr_channels[0] = ['18','mBank','1','https://secure.transferuj.pl/images/kanaly/e_mbank.png','00:00-24:00'];
  2. tr_channels[1] = ['13','ING Bank Śląski SA','1','https://secure.transferuj.pl/images/kanaly/ing.png','00:00-24:00'];
  3. tr_channels[2] = ['14','Inteligo','1','https://secure.transferuj.pl/images/kanaly/inteligo.png','00:00-24:00'];


  1. ["18","mBank","1","https://secure.transferuj.pl/images/kanaly/e_mbank.png","00:00-24:00"],
  2. ["13","ING Bank Śląski SA","1","https://secure.transferuj.pl/images/kanaly/ing.png","00:00-24:00"],
  3. ["14","Inteligo","1","https://secure.transferuj.pl/images/kanaly/inteligo.png","00:00-24:00"]


Troszkę zabawy jest ale unikne w ten sposób wyrażeń regularnych, tylko czy warto.
Cały czas licze, że może jest jakaś biblioteka albo funkcja.
tehaha
Widzę, że wstałeś dzisiaj lewą nogą...Pytanie tak sformuowałeś, że nie pozostowiłeś żadnej innej możliwości niż wyrażenia regularne. Ale gdybyś po prostu opisał sytuację trochę szerzej i napisał jaką funkcjonalność próbujesz uzyskać to mogło by się okazać, że wcale nie musisz parsować pliku .js, bo może istenieć lepsza alternatywa na wykonanie tego co chesz uzyskać.
darko
Cytat(markonix @ 7.09.2012, 12:58:39 ) *
Przecież to są rozwiązania w JS więc co mi z nich?

Zrozum, do pracy w php z json_decode potrzebujesz poprawnie sformatowanych danych JSON, więc
zwykła tablica w js -> tablica w JSON -> json_decode w php i po krzyku.
markonix
Troszkę sie zirytowałem bo jednak mam tam jakiś staż na forum i staram się pisać jasno no a dostaje rozwiązania zupełnie niezgodne z założeniami.

Cel jest prosty - chce zrobić listę form płatności na stronie i tyle.
Plik z tablicą służy temu celowi właśnie i jest gotowa implementacja ale w JS.
A ja chciałbym to mieć w tablicy PHP aby była większa dostępność oraz większa kontrola (chce troszkę tablicę zmienić, dodać elementów), a w PHP znacznie łatwiej będzie mi to robić.

Cytat(darko @ 7.09.2012, 13:18:54 ) *
Zrozum, do pracy w php z json_decode potrzebujesz poprawnie sformatowanych danych JSON, więc
zwykła tablica w js -> tablica w JSON -> json_decode w php i po krzyku.

Ale czego ja nie rozumiem? Sam zaproponowałeś JSON, którego tu nie ma i nie będzie bo źródło pliku jest zewnętrzne i niezależne.
W JS łatwo tablicę zmienie w JSON bo takich rozwiązań jest mnóstwo ale powtarzam 3 raz, że chce stworzyć rozwiązanie PHP only.
CuteOne
Jeżeli coś jest stringiem to potraktuj to jako string - wyrażenia regularne, które usunie zbędne rzeczy + json_decode(str, true). Innej możliwości nie widzę smile.gif
tehaha
Cytat
Troszkę sie zirytowałem bo jednak mam tam jakiś staż na forum i staram się pisać jasno no a dostaje rozwiązania zupełnie niezgodne z założeniami.

Cytat
Cel jest prosty - chce zrobić listę form płatności na stronie i tyle.
Plik z tablicą służy temu celowi właśnie i jest gotowa implementacja ale w JS.

No widzisz, masz staż, ale jednak założyłeś, że to co chesz zrobić jest oczywiste...rozumiem, że chodzi o ten plik: https://secure.transferuj.pl/channels-10100.js
Generalnie jest on tak prosty, że wystarczynawet kilka pętli z explode()
markonix
Cytat(tehaha @ 7.09.2012, 13:36:15 ) *
No widzisz, masz staż, ale jednak założyłeś, że to co chesz zrobić jest oczywiste...

Nie rozumiem co masz na myśli.
To co chce zrobić to tablicę PHP, a jaki jest tego cel to przyznaj, że nie ma to znaczenia.
Bo czy będę chciał to dodać do bazy czy wyświetlić to działanie na pliku nie zmienia się.

Tak, to ten plik.
Jest prosty, ale chce to zrobić w miarę elastycznie bo ma to służyć automatycznej aktualizacji.

Myślę mniejwięcej nad takim algorytmem:

1. Rozpoczęcie parsowania od pierwszego elementu tablicy (pominięcie komentarza i zainicjowania tablicy).
2. Wyrzucenie początku "tr_channels[0] = [" . Tutaj wyróżnienie regularne albo obcięcie stringa.
3. Wyrzucenie końcówki ];
4. Explode na przecinku. Wyrzucenie pojedynyczych cudzysłowiów.
tehaha
Cytat
To co chce zrobić to tablicę PHP, a jaki jest tego cel to przyznaj, że nie ma to znaczenia.
No właśnie sęk w tym, że mogłoby się okazać, że istnieje inne rozwiązanie na wyświetlenie listy kanałów, niż parsowanie tablicy .js, chociażby pobranie ich z podstrony oferty, ale widzę, że tam nie ma ID, bo pewnie sam nie raz zauważyłeś na forum, że ktoś przychodzi z dziwnym problemem, a potem się okazuje, że daną funkcjonalność można było inaczej uzyskać. Akurat w tym przypadku dziwne jest, że transferuj nie udostępnia bardziej wszechstronnego formatu, ale trudno.

Ponieważ plik jest prosty i kolejne wersję będą miały podobną strukturę dla utrzymania wstecznej kompatybilności, ja bym to zrobił mniej więcej tak:
  1. $js = file('https://secure.transferuj.pl/channels-10100.js');
  2. $array = array();
  3. foreach($js as $line)
  4. {
  5. if(strpos($line, '=') && !strpos($line, 'Array'))
  6. {
  7. $lineParts = explode('=', $line);
  8. $lineData = explode(',', str_replace(array('[', ']', ';', "'"), array('', '', '', ''), $lineParts[1]));
  9. $array[] = array('id'=>$lineData[0], 'name'=>$lineData[1],'active'=>$lineData[2], 'url'=>$lineData[3], 'hours'=>$lineData[4]);
  10. }
  11. }
  12. print_r($array);
darko
Cytat(markonix @ 7.09.2012, 13:42:55 ) *
Myślę mniejwięcej nad takim algorytmem:

1. Rozpoczęcie parsowania od pierwszego elementu tablicy (pominięcie komentarza i zainicjowania tablicy).
2. Wyrzucenie początku "tr_channels[0] = [" . Tutaj wyróżnienie regularne albo obcięcie stringa.
3. Wyrzucenie końcówki ];
4. Explode na przecinku. Wyrzucenie pojedynyczych cudzysłowiów.

To, co tutaj opisujesz to jest dokładnie to, co robią wymienione przeze mnie narzędzia i przed użyciem których się tak wzbraniasz. Powtórzę raz jeszcze najszybciej będzie zrobić tak:
1) $t = file_get_contents (pobieramy zawartość js);
2) konwertujemy wybranym narzędziem tekst js do json, możesz zrobić tak, że to, co pobierzesz w kroku 1) odsyłasz do skryptu js, na końcu on Ci po obróbce odsyła gotowy json
3) na końcu w php json_decode
Nie ma sensu wymyślać koła na nowo i bawić się wyrażeniami regularnymi. Tłumaczenie, bo ja chcę to zrobić tylko w phpie spowoduje, że spędzisz najbliższe godziny, albo i nawet dni nad wymyślaniem gotowego algorytmu, który zamieni Ci proste typy danych javascriptowych do notacji JSON. Alternatywnie, podejrzyj, jak taki parser w js został napisany i wzorując się na gotowcu, napisz własny w php, to tylko kilka godzin pracy (dla bardziej złożonych struktur danych typu tablica obiektów będzie niezła zabawa).

markonix
Raczej nie godziny co pokazał kolega tehaha.
Mnie też wyszła pętla parsująca ale skorzystam z tego żeby nie zmarnować smile.gif
Zapomniałem o file, który tutaj lepiej się nada bo już jest w tablicy każda linia.

Cały czas nie rozumiem czemu tak ciężko przyjąć, że chce rozwiązanie PHP..

Równolegle napisze do Transferuj żeby się troszkę wysilili. Zwykle moje sugestie wprowadzają.



Tak uzupełniająco moja propozycja (bez asocjacyjnej).

  1. $array = array();
  2. $file = file('https://secure.transferuj.pl/channels-10100.js');
  3. foreach($file as $oneLine) {
  4.  
  5. if ('tr_c' == substr($oneLine, 0, 4)) {
  6. $array[] = explode(',', str_replace(array('];', "'"), array('', ''), substr($oneLine, strrpos($oneLine, '= [') + 3)));
  7. }
  8.  
  9. }
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.