PHP-ban JS literálból json reguláris kifejezéssel
2021-07-19T17:12:47+02:00
2021-07-20T18:24:19+02:00
2022-08-12T03:45:31+02:00
gyendresz
Sziasztok,

Mégis csak kellene egy reguláris kifejezés amivel az alábbi mintát szabványos jsonná tudom alakítani:
{cat:{id:a,name:"root",image:b,count:78},parents:[d,x,fJ,{id:yz,name:yA,slug:yB}]}

Ameddig eljutottam az túl sok kozmetikázást igényelne:

<!DOCTYPE html> <html> <body> <?php $input ='{cat:{id:a,name:"root",image:b,count:78},parents:[d,x,fJ,{id:yz,name:yA,slug:yB}]}'; $result = preg_filter('/:|,(?!")/', '"$0"', $input); print_r($result); ?> </body> </html>
Mutasd a teljes hozzászólást!
Indulj ki valami ilyesmiből:

$result = preg_replace('/([[{,:])([ a-zA-Z0-9]+)/', '\1"\2"', $input);
Mutasd a teljes hozzászólást!

  • Hát ez még rosszabb mint az előző problémádban felvetett adat. Itt már nem csak a kulcsokról hiányzik a quote, hanem az értékekről is, de csak néha? :) Nem lehetne az adatforrásnál megjavítani a fájlt, hogy amire neked parseolni kell, addigra már jó legyen?
    Mutasd a teljes hozzászólást!
  • Ezek főleg JS-ben nyomják, nekik ez így természetes .
    Mutasd a teljes hozzászólást!
  • Indulj ki valami ilyesmiből:

    $result = preg_replace('/([[{,:])([ a-zA-Z0-9]+)/', '\1"\2"', $input);
    Mutasd a teljes hozzászólást!
  • Egyből a megoldás? Semmi előjáték?
    Kicsit megalázó a részemre, de koszönöm .

    (Remélem, a teljes sztringen működni fog és nincs más csapda benne.)

    EGY
    Mutasd a teljes hozzászólást!
  • Azért nekem is hozzá kellett tennem mert volt benne "$" meg "_" is , de egy validátor segített.
    (Történetesen ez: JSON validátor és formatter , hogy komplett legyen, ha hasonló problémája van valakinek.)

    $result = preg_replace('/([[{,:])([ a-zA-Z0-9_\$]+)/', '\1"\2"', $input);
    Remélem a többiben nem raknak mas gyalogsági aknát.

    Köszönöm: EGY
    Mutasd a teljes hozzászólást!
  • Hali!

    … és nincs más csapda benne.

    Márpedig van. Például:
    {cat:{id:a,name:"root",image:b,count:78,title:"{Példa:ez itt}"}}
    Eredménye:
    {"cat":{"id":"a","name":"root","image":"b","count":"78","title":"{"P"élda:"ez itt"}"}}
    Ráadásul, a számokkal mi a helyzet? Biztosan szövegként szeretnéd őket?

    Ilyet nem lehet – csak – reguláris kifejezésekkel megoldani (inkább pl. tokenizálással).

    Mutasd a teljes hozzászólást!
  • Bízom a szolgáltató jóindulatában.
    Ha működik, nekem már jó, de a jogos észrevételedet megpróbálom észben tartani arra az esetre, ha ők is olvasták és kedvet kapnak a további szivatáshoz.
    (Azért tokenizálással nem egy sor lenne a megoldás, ami most életet ment.)
    Mutasd a teljes hozzászólást!
  • Hali!

    Azért tokenizálással nem egy sor lenne a megoldás…

    Mit számít, hogy hány sor a megoldás? Főleg akkor, hogy ha ez a mostani nem is megoldás.

    Mutasd a teljes hozzászólást!
  • Tisztelem maximalizmusodat, de nekem ami gyorsan megfelelő eredményt ad az megoldás.
    Ha -reményeim szerint 10 év múlva- nem tudja betölteni a jsont, az unokám fejcsóválva 
    kijavítja mondván "már akkor nem volt százas a nagyfater".

    (Ha előbb rászorulok a jobb megoldásra, úgy is itt fogom megkérdezni.)
    Mutasd a teljes hozzászólást!
  • Hali!

    … de nekem ami gyorsan megfelelő eredményt ad az megoldás.

    Na, pont az ilyen „megoldások” a gányolások! Honnan tudod, hogy megfelelő eredményt ad? Teljes körű infód van arról, hogy milyen bemenetek lehetnek? Vagy minden lehetséges bemenetre letesztelted, ami előfordulhat?

    … nem tudja betölteni a jsont…

    Most akkor JSON-t kell betöltened (feldolgoznod?) vagy JS Object Literal-t? Bár, ami bemenetet mutattál, az még az OL-től is messze van.

    Ha előbb rászorulok a jobb megoldásra, úgy is itt fogom megkérdezni.

    És akkor mi fog történni? Zárjuk le a témát majd azzal, hogy már tettél fel ilyen kérdést és meg is oldódott?

    Ha tényleg csak arra az egyetlen bemenetre kértél egy reguláris kifejezést, ami segítségével megfelelő JSON-szöveggé tudod alakítani, OK, legyen. De ha valaki a jövőben felkeresi ezt a témát, mert szeretne egy JS OL-to-JSON konvertálást PHP-ben, akkor rájön, hogy az elfogadott válasz nem megoldás.

    Ez itt a lényeg.

    Mutasd a teljes hozzászólást!
  • Gányolás? - Elfogadom.

    Egy szótárt kell áttöltenem egy másik rendszerből. Ezt egy algoritmus prezentálja ami ha ma ilyen lett, holnap se lesz másmilyen (amíg nem változtatják meg, ha meg megváltoztatják az egy teljesen más helyzet lesz).
    Az inputhoz a PHP-ban legközelebb a json áll amit könnyen fel lehet dolgozni.
    Remélem, mire legközelebb hasonló problémám lesz, valaki csinál egy csili-vili függvényt vagy lesz egy belső függvény a feladatra.
    Nem áll rendelkezésemre korlátlan erőforrás, hogy mindent maximális minőségben tudjak megvalósítani.

    Ezt a jelen feladatnál vállalható kompromisszumnak gondolom. 

    Valóban kíváncsi vagyok a megoldás határaira.
    Ha a következő érdeklődőnek nem jön be ez a megoldás -olvasva jogos észrevételedet- már sokkal okosabb lesz mint én voltam a feladat megfogalmazásakor.

    EGY
    Mutasd a teljes hozzászólást!
  • Hali!

    Ezt egy algoritmus prezentálja ami ha ma ilyen lett, holnap se lesz másmilyen (amíg nem változtatják meg, ha meg megváltoztatják az egy teljesen más helyzet lesz).

    Nem feltétlenül gondolom, hogy csak az „algoritmus” függvénye lehet ez. Ha nem állít elő olyan szöveget, amiben van pl. vessző vagy kettőspont, mert pl. a "name" mező lazán tartalmazhat ilyet (hogy csak a legegyszerűbb példákat mondjam), akkor OK.

    Ezt a jelen feladatnál vállalható kompromisszumnak gondolom. 

    Rendben, ahogy' gondolod.

    Valóban kíváncsi vagyok a megoldás határaira.

    Korábban írtam már rá példát, de itt van még egyszerűbb: a "name" mező értéke vesszőt is tartalmaz:
    {cat:{id:a,name:"Knight, Michael",image:b,count:78}}
    A megadott reguláris-kifejezéses csere eredménye:
    {"cat":{"id":"a","name":"Knight," Michael"","image":"b","count":"78"}}
    Nem gondolom, hogy ez megfelelő JSON-szöveg lenne.

    Mutasd a teljes hozzászólást!
  • Láttam a példád és meg is értettem, hogy számolnom kell vele.
    A gyakorlatban megfelelő jsont generált, de használhatatlannak bizonyult és nem szintaktikai hiba miatt.
    Nem ismerem a JS literál felépítését, de valahogy a struktúrában megjelenített változók értéket kapnak. Adott példában volt olyan, amire szükségem volt és menet közben kapott értéket.
    Kénytelen voltam  const myJSON = JSON.stringify(myObj);-vel programon kívül átalakítani. Ekkor megkapta az értéket és már szabványos jsonként tudtam használni.
    Ez még nagyobb gányolás mert nem automatizálható (legalábbis még nem tudom hogyan), de most lehet a lényeggel foglalkozni.
    (Na a JSON.stringify leprogramozására sem szívesen vállalkoznék.)

    EGY
    Mutasd a teljes hozzászólást!
abcd