js array naar PHP array

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Innovatieve, nauwkeurige Senior PHP Developer voor

Eind jaren ’90 is dit bedrijf opgericht. Ze hebben zich altijd beziggehouden met het ontwikkelen van software voor overheidsinstanties. Dit zijn instanties waaronder bijvoorbeeld ook onder andere : de belastingdienst, burgerszaken, verschillende bedrijven, notarissen, incassobureau’s en ook nog bewindvoerders. Momenteel tellen ze 20 medewerkers, waarvan 2/3 deel allemaal developers zijn. Doordat ze de enigste aanbieder van dit soort software op de markt zijn, groeien ze erg hard. Door de enorme groei, hebben ze dan ook concrete groeiplannen in het verschiet. Functie-omschrijving Het bedrijf wordt door allerlei instanties ingeschakeld. Tegenwoordig wordt alles digitaal geregeld en gezien de essentie van dit soort

Bekijk vacature »

Daniel van Seggelen

Daniel van Seggelen

19/03/2018 19:07:30
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var CatalogData= {
    "Catalog": {
        "Id":200505,
        "Title":"test titel",
        "StoreId":60,
        "Height":480,
        "Width":248,
        "NumPags":26,
        "Logo":"https://static0.tetetetetet.nl/upload_negocio/negocio_59/logo2.png",
        "Category":"Huizenmarkt",
        "CategoryId":1,
        "StartDate":"19/03/2018",
        "EndDate":"25/03/2018",
        "ShowTagDetails":false,
        "IsExpired":false,
        "IsUpcoming":false,
        "UrlVisorFlashCliente":"",
        "WithAds":true,
        "Retailer": {
            "Id": 59, "Name": "winkelnaam", "MoreCatalogs": 0, "OpenArticleInNewWindow": true
        }
    }
}


Beste,

Ik probeer met "preg_match" uit een javascript functie hierboven beschreven de waarden uit te halen met php.

Is dit mogelijk?
Gewijzigd op 19/03/2018 19:13:14 door - Ariën -
 
PHP hulp

PHP hulp

17/12/2018 21:45:52
 
- Ariën -
Beheerder

- Ariën -

19/03/2018 19:14:02
Quote Anchor link
Heb je zelf toegang tot CatalogData? Kan je dit niet serialised via AJAX verwerken dan?
 
Rob Doemaarwat

Rob Doemaarwat

19/03/2018 19:31:58
Quote Anchor link
Als je dat stuk "var CatalogData= " d'r af knipt kun je het restant via json_decode() eenvoudig naar een array omzetten (zie ook de 2e parameter van die functie http://www.php.net/json_decode )
 
Frank Nietbelangrijk

Frank Nietbelangrijk

19/03/2018 23:19:04
Quote Anchor link
Deze notatie
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
{"key":"value"}

Noemen we JSON. JSON staat voor "JavaScript Object Notation". Het is een vrij eenvoudige manier van data uitwisseling die gebruikt wordt tussen (bijvoorbeeld) PHP en javascript, vaak in combinatie met AJAX. Soms wordt JSON ook in PHP gebruikt om een (numerieke/associatieve/multidimensionale) array op te slaan in een bestand. Voordat JSON geïntroduceerd werd maakte men vaak gebruik van XML om data heen en weer te zenden maar na de komst van JSON wordt deze het meest gebruikt omdat de notatie simpel en korter is.

Handig om te weten:
Wat in JSON tussen accolades {} staat is een object, ofwel een associatieve array in PHP termen.
Wat in JSON tussen blokhaken [] staat is een (numerieke) array.

Een simpele array:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
["Ford","BMW","Fiat"]

Een Object:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
{"name":"Frank","gender":"Male"}


Een object kan echter array's bevatten en je kunt ook een array van objecten hebben of een array in een array etc..
Gewijzigd op 19/03/2018 23:21:08 door Frank Nietbelangrijk
 
Daniel van Seggelen

Daniel van Seggelen

20/03/2018 02:38:46
Quote Anchor link
Bedankt voor dereacties.

Ik zie deze code op mijn pagina in de source in de js functie van mijn eerste post.

Deze hele source krijg ik via file_get_contents in een string.

Dan doe ik:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
preg_match('#var CatalogData  = (.*?);\s*$#m', $url, $matches);
echo 'test:'.$matches[1];


maar krijg de melding:

PHP Notice: Undefined offset: 1 in /home/bla/bla/class/class.php on line 348

Wat doe ik fout?


Toevoeging op 20/03/2018 11:51:20:

HEt komt erop neer dat die functie dus in een string is, maar ik deze niet eruit kan scrapen.
Is dit wel mogelijk?
 
Rob Doemaarwat

Rob Doemaarwat

20/03/2018 16:11:54
Quote Anchor link
Zit in die $url letterlijk je URL, of de file_get_contents($url)? Dat maakt nogal verschil. Overigens, als de "opmaak" van de data altijd zo is, dan heb je helemaal geen regex nodig:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
$json = trim(file_get_contents($url),' ;');
$data = json_decode(trim(substr($json,strpos($json,'=') + 1)),true);
 
Daniel van Seggelen

Daniel van Seggelen

21/03/2018 02:36:24
Quote Anchor link
Dat werk helaas niet.

$url daar zit de gehele inhoud van 1 pagina in.

Dus zeg maar $url = file_get_contents($url).

Dat is dus de source van de pagina, maar de source bevat javascript en html etc.
Ik wil dus die functie die ik in mijn eerste bericht had genoemd filteren en omzetten in php waarden.
 
Rob Doemaarwat

Rob Doemaarwat

21/03/2018 09:31:46
Quote Anchor link
Dan zul je even de URL van die pagina door moeten geven, maar als ik zo naar je regex kijk zou ik die $ op het eind d'r uit laten. Het document zal na de punt-komma waarschijnlijk wel niet eindigen. Tevens nog een "s" modifier toevoegen om de punt ook regeleinden te laten matchen.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
preg_match('#var CatalogData\\s*=\\s*(.*?});#ms', $url, $matches);

(die sluit accolade heb ik binnen de grouping haakjes gezet om te voorkomen dat ie wat al te happig is op punt-komma's binnen de data).
Gewijzigd op 21/03/2018 09:32:24 door Rob Doemaarwat
 
Willem vp

Willem vp

21/03/2018 09:48:04
Quote Anchor link
Ik zie in de regex een escaping die daar niet thuishoort (\\s ipv \s). Verder match je ook de begin-accolade (die je denk ik niet wilt hebben) en wil je een puntkomma matchen die niet in je voorbeeld staat (en volgens mij syntactisch ook niet op die plek mag staan). En, zoals Rob al zei: ook de linebreaks moeten worden gematcht door een punt. Dit zou dus moeten werken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
preg_match('#var CatalogData\s*=\s*{(.*?})#ms', $url, $matches);

Er zit nog 1 probleempje in: als het laatste element in je JSON-object ook een object is (zoals "Retailer" in je oorspronkelijke post) dan match je een } te weinig. Aangezien de volgorde van de elementen in principe willekeurig is, kun je die extra } echter ook niet (of in ieder geval niet eenvoudig) in je regex matchen.
 
Daniel van Seggelen

Daniel van Seggelen

21/03/2018 11:31:32
Quote Anchor link
Gweldig bedankt. Dit werkt. Alleen om het om te zetten naar php waarden:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
preg_match('#var CatalogData\\s*=\\s*(.*?});#ms', $url, $matches);
$data =  $matches[0];

$json = trim(file_get_contents($data),' ;');
$yes = json_decode(trim(substr($json,strpos($json,'=') + 1)),true);


echo $yes;    


Dit is leeg.

Dit is exact wat ik terug krijg:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
<br>http://www.deurlwaarhetomgaat.nl?view=result&amp;buscar=Supermarkt&amp;pos=0&amp;refPageType=OFFERS&amp;pagina=1
var CatalogData = {"Catalog":{"Id":200541,"Title":"Pasen Magazine","StoreId":347,"Height":480,"Width":384,"NumPags":36,"Logo":"https://static0.urlo.nl/upload_negocio/negocio_128/logo2.png","Category":"Supermarkt","CategoryId":1,"StartDate":"19/03/2018","EndDate":"02/04/2018","ShowTagDetails":false,"IsExpired":false,"IsUpcoming":false,"UrlVisorFlashCliente":"","WithAds":true,"Retailer":{"Id":128,"Name":"Plus","MoreCatalogs":0,"OpenArticleInNewWindow":true},"OnlyOnline":false,"HasTags":true,"CustomHtml":"\u003cdiv style=\"width:336px;\"\u003e\u003cp id=\"dfp_visorLeftTitle\" style=\"margin:30px 0px 0px;text-align: left;font-size:14px\"\u003e\u003c/p\u003e\u003c/div\u003e\u003cdiv style=\"margin-top:5px;\"\u003e\u003cscript async=\"async\" src=\"https://www.googletagservices.com/tag/js/gpt.js\"\u003e\u003c/script\u003e\n\u003cscript\u003e\n  var googletag = googletag || {};Plus


De style heb ik niet nodig, en ik zie ook dat er 2 sluit } missen.
Hoe kan ik hier een php array van maken?
Gewijzigd op 21/03/2018 11:41:33 door Daniel van Seggelen
 
Rob Doemaarwat

Rob Doemaarwat

21/03/2018 11:46:04
Quote Anchor link
Nee, nu wordt het
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
$html = file_get_contents($url); //HTML ophalen van URL
if(preg_match('#var CatalogData\\s*=\\s*(.*?});#ms', $html, $matches)){ //JSON uit HTML peuteren
  $json = $matches[1]; //JSON zit in group 1 van de match
  $data = json_decode($json, true); //JSON string naar assoc.array omzetten
  print_r($data);
}

Anders overal even een var_dump tussendoor, en kijken waar het mis gaat.
 
Daniel van Seggelen

Daniel van Seggelen

21/03/2018 11:52:17
Quote Anchor link
Quote:
Er zit nog 1 probleempje in: als het laatste element in je JSON-object ook een object is (zoals "Retailer" in je oorspronkelijke post) dan match je een } te weinig. Aangezien de volgorde van de elementen in principe willekeurig is, kun je die extra } echter ook niet (of in ieder geval niet eenvoudig) in je regex matchen.
Quote:


In principe is dit al voldoende

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
"Catalog": {
        "Id":200505,
        "Title":"test titel",
        "StoreId":60,
        "Height":480,
        "Width":248,
        "NumPags":26,
        "Logo":"https://static0.tetetetetet.nl/upload_negocio/negocio_59/logo2.png",
        "Category":"Huizenmarkt",
        "CategoryId":1,
        "StartDate":"19/03/2018",
        "EndDate":"25/03/2018",
        "ShowTagDetails":false,
        "IsExpired":false,
        "IsUpcoming":false,
        "UrlVisorFlashCliente":"",
        "WithAds":true,
        "Retailer": {
            "Id": 59, "Name": "winkelnaam", "MoreCatalogs": 0, "OpenArticleInNewWindow": true
        }


Dus zonder de gehele variabele naam etc. Als ik deze informatie in PHP kan krijgen, is het al opgelost
 
Willem vp

Willem vp

21/03/2018 12:09:24
Quote Anchor link
> In principe is dit al voldoende

Daar mist dus nog een sluit-accolade, waardoor de json_decode niet zal gaan werken.
Ik weet nog wel een truukje, maar dat is vrij smerig: je moet dan in de gematchte string de { en de } tellen en net zoveel } aan het eind toevoegen als je mist (waarschijnlijk is dat aantal 0 of 1).
 
Thomas van den Heuvel

Thomas van den Heuvel

21/03/2018 16:14:13
Quote Anchor link
Ben ik toch benieuwd wat je aan het doen bent? JSON aan het scrapen van een of andere site? En waarvoor? Ben je een zoekmachine aan het bouwen? En in welke capaciteit? Ben je (edit: betaald, freelance) programmeur? Student? Hobbyist?
Gewijzigd op 21/03/2018 17:32:05 door Thomas van den Heuvel
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.