js array naar PHP array
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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
}
}
}
"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 -
Heb je zelf toegang tot CatalogData? Kan je dit niet serialised via AJAX verwerken dan?
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:
Een Object:
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
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)
1
2
2
preg_match('#var CatalogData = (.*?);\s*$#m', $url, $matches);
echo 'test:'.$matches[1];
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?
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:
$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.
modifier toevoegen om de punt ook regeleinden te laten matchen.
(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).
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" (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
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.
Code (php)
1
2
3
4
5
6
7
8
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;
$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)
1
2
2
<br>http://www.deurlwaarhetomgaat.nl?view=result&buscar=Supermarkt&pos=0&refPageType=OFFERS&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
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
Code (php)
1
2
3
4
5
6
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);
}
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.
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
Dus zonder de gehele variabele naam etc. Als ik deze informatie in PHP kan krijgen, is het al opgelost
In principe is dit al voldoende
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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
}
"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
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).
Gewijzigd op 21/03/2018 17:32:05 door Thomas van den Heuvel