Autor Zpráva
midlan
Profil
Ahoj,

potřeboval bych zparsovat JS kód přiřazení do pole s kterými se bude dát dál v PHP pracovat.

        window.prom1="data1";
        window.prom2="data2";
        window.prom3="data3";

Vyparsování patřičného <script> ze stránky už mám vyrešené, data se dají zparsovat přes json_decode, takže to taky není problém. Problém je jak zjistit kde končí ta data samotná. Na středník (může být součástí stringu) ani na odřádkování se spolehnout nedá. Zatím jako jediné spolehlivé řešení je plnohodnotný parser se zásobníkem atd. Věděl by někdo jak to vyřešit nějak rychleji a elegantně?
_es
Profil
Viď Základní kurz 15: Komunikace mezi PHP a JavaScriptem.
Alphard
Profil
_es [#2]:
Na mě ten dotaz působí tak, že midlan si toto uvědomuje, spíš chce parsovat nějakou cizí stránku, nebo tak něco.

midlan [#1]:
Tipuji správně? Napsat parser javascriptu není reálné. Napsat funkci eatString() by bylo naopak docela jednoduché, i včetně všech možných escapování, ale jak tam někdo napíše var v = 'jedna' + ' dva';, tak to stejně celé spadne. Bude potřeba předpokládat nějaké specifičtější zadání.
_es
Profil
Alphard [#3]:
Je to nejaké „zmätočné“. Žiadne „pole“ v tom JS nie je. A prečo je namiesto definícií „normálnych premenných“ hentaký kód...
midlan
Profil
Alphard:
Ano je to přesně tak, parsuji cizí stránku.

ale jak tam někdo napíše var v = 'jedna' + ' dva';, tak to stejně celé spadne
Jak jsem napsal, mělo by se dát spolehnout na to, že data (za pravou část přiřazení za =) lze zparsovat pomocí json_decode. Autor stránky totiž obsah zřejmě generuje přes json_encode. Myslím tedy, že uvedený výraz s + se tam nevyskytne. Možná od toho by se tedy dalo odrazit.
_es
Profil
midlan [#5]:
Možno by bolo vhodnejšie spýtať sa „autora stránky“, či s takýmto využitím súhlasí. Asi nie, keď s tým robíš také tajnosti. V opačnom prípade by bol možno ochotný poskytnúť nejaký lepší prístup k tým dátam.
midlan
Profil
_es:
Proč bych se autora měl ptát? Všechno co posílá klientovi je pro klienta určené. A je jedno jestli je klientem člověk nebo stroj. A zrovna tohle jsou data, která se vyrenderují po načtení stránky, takže jsou viditelná i člověku. Ale touto otázkou bych se tu nezabýval.

Můžu říct, že se jedná o jeden velký nadnárodní web, API bohužel neposkytuje.
_es
Profil
midlan:
Můžu říct, že se jedná o jeden velký nadnárodní web, API bohužel neposkytuje.
Tak to ti potom asi s takým neúplným zadaním ťažko niekto poradí.

Proč bych se autora měl ptát?
Pretože to platí, prevádzkuje...

A je jedno jestli je klientem člověk nebo stroj.
No ale keď bude ten „stroj“ príliš odlišný „klient“, tak sa môže ľahko stať, že bude ten klient nejako zablokovaný, či už automaticky alebo ručne.
midlan
Profil
_es:
Zadání je kompletní, viz první příspěvek.

Zmíněný web na návštěvnosti z "našeho stroje" profituje, na provozu k nám tedy není tratný, naopak. Proto zde není ani důvod k blokaci, ověřeno již několika měsíci provozu.

Tímto končím tuto offtopic debatu a prosím i všechny ostatní aby další odpovědi směřovaly k řešení problému.
_es
Profil
midlan:
Na středník (může být součástí stringu) ani na odřádkování se spolehnout nedá.
Môžeš sa „spoľahnúť“ na ukončujúcu úvodzovku, len pred ňou nesmie byť opačná lomka (\).
midlan
Profil
_es:
To právě nemůžu, těch stringů tam může být více. V příkladu jsem to neukázal, ale může tam právě být zakódované i pole. Tedy bavíme se o celém validním výstupu z json_encode, jak už jsem zmínil :/
_es
Profil
midlan [#11]:
To ti teda asi ťažko niekto poradí, keď to je také tajné, že ani nemôžeš dať dosť informácií.

Tedy bavíme se o celém validním výstupu z json_encode, jak už jsem zmínil :/
No ale z tej PHP funkcie je výstupom jeden textový reťazec, viacero JS príkazov z toho nijako „nevylezie“, takže o akých „viacerých stringoch“ píšeš?

ověřeno již několika měsíci provozu.
Keďže asi ide o nejakého „medziklienta“, je to overené aj s nejakou vyššou návštevnosťou? Napríklad Google služby vtedy zablokujú prístup veľmi rýchlo.
TomášK.
Profil *
midlan:
Najdi středník. Pokud to, co je předním po ořezání window.prom1=, půjde naparsovat jako JSON, pak si patrně trefil ten správný středník. Pokud ne, zkus další.

A _es má pravdu, že je to právně problematické. Pokud to parsujete pro vlastní potřebu, je to ok, ale pokud to chcete dávat dál, už to to ok být nemusí.
midlan
Profil
_es:
Nic tajné není, řekl jsem vše co je potřeba, tak přestaň provokovat.

Z té PHP funkce je výstupem několik textových řetězců pokud je to pole! Představ si následující kód:

<?php
$pole = array(
    "foo" => "bar",
    "bar" => "foo",
);
?>
window.prom3=<?php echo json_encode($pole); ?>;

Výstup bude něco jako:

window.prom3={"foo":"bar","bar":"foo"};

Tak snad už je to jasné i pomalejšímu _es. Omlouvám se za ten tón ale pořád odbíháš od tématu a rady jsem se od tebe nedočkal žádné. Že neřeknu zdrojový web, ano tak to je smiř se s tím, je to projektové know-how. A o žádného meziklienta se nejedná, jsou to data čistě pro nás a pro ně, tedy pro naší potřebu a právně je vše v pořádku.

TomášK.:
Děkuji to zní rozumně! Asi to tak udělám :) Konečně někdo kdo poradí a nechodí kolem horké kaše.
1Pupik1989
Profil
midlan:
Já bych počítal složené závorky. Díky tomu budeš vědět která je poslední.
_es
Profil
midlan:
Výstup bude něco jako:
Keď dáš nedostatočné zadanie a nezrozumiteľne a zmäteno sa vyjadruješ, tak sa nemôžeš čudovať, že nedostaneš dostatočnú radu. Z [#1] nie je vôbec jasné, o akom „poli“ „točíš“, či si pod tým predstavuješ tú trojicu vlastností vo window či niečo iné. V JS je „pole“ napríklad [10, 20, 30], to v [#14] je „objekt“. Takže keď nevieme, čo presne ten tajný „nadnárodný web“ generuje, tak je asi rada obtiažna. Skús si zo špecifikácie JSON naštudovať jeho presnú syntax - to by ti mohlo pomôcť.

TomášK.:
Najdi středník.
Asi to tak udělám :)
To má ale vadu v tom, že v JS je možné príkazy oddeľovať aj znakom konca riadka, čo samozrejme nemáme ako zistiť, či to v tom webe nenastáva. Okrem toho, za posledným príkazom v JS kóde nemusí byť žiaden oddeľovač. Alebo, príkazy v [#1] sú zároveň aj výrazy, takže to môže byť aj napríklad v tvare:
window.prom1="data1",window.prom2="data2",window.prom3="data3";.

Ďalšia možnosť je poslať ten JS kód až do prehliadača, aby ho nejako vhodne v JS spracoval.
TomášK
Profil
_es:
Souhlasím s tím, že to zadání nebylo jednoznačné, vypadalo to spíš tak, že "data1" obsahuje oescapovaný JSON řetězec, ve skutečnosti je tam přímo ten JSON bez obalení aspostrofy. Pak už začne dávat smysl, kde se berou pole, objekty a tak.

Ano, středník je nástřel, ale doupravit to podle konkrétní situace už je jednoduché. Pokud tam má i čárky nebo konce řetězců, tak bude hledat konce řetězců a když tam nic takového není, vezme celý zbytek. Předpokládám, že si to už doladí dle konkrétní situace.

O něco elegantnější by bylo sehnat/napsat JSON parser, který dokáže z řetězce naparsovat JSON a vrátit zbytek řetězce. Ale tady to asi nemá smysl moc řešit, stejně se to kdykoliv může bez varování rozbít.
_es
Profil
TomášK [#17]:
Ono tam teoreticky nemusí byť nič z toho, čo popisuješ. Ak sa zdrojová stránka stará len o to, aby bola v globálnej vlastnosti prom1 nejaká hodnota a neráta s tým, že to bude spracúvať niečo iné ako prehliadač, tak je tých možností naozaj neúrekom:
nejakáFunkcia(window.prom1="data1");
prom1="data1";
this.prom1="data1";
window.prom1=nejakáPremenná="data1";
var prom1="data1";
var x, prom1="data1";
window["prom1"]="data1";
i=1; window["prom"+i]="data1";
...
midlan
Profil
Stránka generuje jen možnost popsanou v [#1] takže řešení od TomášK je dostatečné. Tímto bych to uzavřel, díky za rady.
TomášK
Profil
_es:
Zadání není v proměnné window.prom1 je něco, co chci parsovat jako JSON, ale mám řetězec ve tvaru
window.prom1=<json>;
window.prom2=<json>;
window.prom3=<json>;
, jak z něj naparsuju ta data?


V prvním případě by potřeboval javascript engine, ve druhém je to jen zpracování řetězce, který je náhodou zdrojový kód JS. Aneb máš pravdu, že se dá přiřadit všeljak, ale zdá se mi, že řešíš něco jiného než je v dotazu.
_es
Profil
TomášK:
Zadání není v proměnné window.prom1 je něco, co chci parsovat jako JSON, ale mám řetězec ve tvaru
To predsa nie je zadanie pochádzajúce od autora zdrojovej stránky. Od neho je zadanie, aby v prom1 bola príslušná hodnota. Stránka“ to môže hocikedy zmeniť a celý „medziklient“ sa na základe toho znefunkční. A to môže nastať ešte horšia možnosť, že sa zmení prenos či formát dát ešte výraznejšie. Čo je dosť pravdepodobné, keďže autor neurčil ten JS kód na niečo iné, než na jeho primárny účel.
Keeehi
Profil
_es:
A to môže nastať ešte horšia možnosť, že sa zmení prenos či formát dát ešte výraznejšie.
Ano, a proto je naprosto zbytečné se možností změny zabývat. Prostě až se to změní, tak bude potřeba to opravit. Řešit by to mělo smysl jen v případě, že by se to měnilo často, nebo by šlo o něco kritického, kde výpadek není možný.
midlan
Profil
Přesně tak, řešíme to vždy až se něco změní. Vcelku rychle přijdeme na to že něco nefunguje, ale neděje se to často, třeba jednou za půl roku.

Speciálně pro _es a jeho spekulace dodávám, že zrovna toto je místo, kde změny očekávám nejméně. Slouží totiž jen jako nosič dat. Většinu ostatních věcí ze stránky parsuji z viditelných prvků přes xpath, tedy drobný zásah do designu stránky může způsobit komplikace, ač se snažím xpath dotazy psát hodně obeceně. Naopak data budou pravděpodobně pořád stejná i po změně designu. A že by někdo měnil zaběhnutý systém předávání dat do javascriptu jen tak z nudy se mi taky nezdá.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: