2016-10-23 15 views
0

я создал очень простой скрипт, который получает данные из URL с PHP (для трендов Google):Как preg_match() переменную из file_get_contents()

$url = 'https://www.google.com/trends/fetchComponent?hl=en-US&q=battlefield%201&cid=TIMESERIES_GRAPH_0&export=5&w=500&h=300&gprop=youtube&date=today%201-m'; 
$url2 = file_get_contents($url); 

В исходном коде есть определенный тип данных, которые я хочу извлечь

{"columns":[{"id":"d","label":"Date","type":"datetime"},{"role":"annotation","type":"string"},{"p":{"html":true},"role":"annotationText","type":"string"},{"id":"q0","label":"battlefield 1","type":"number"},{"role":"annotation","type":"string"},{"p":{"html":true},"role":"annotationText","type":"string"},{"role":"certainty","type":"boolean"}],"headlineDataPoints":[],"width":485,"axisAnnotations":[],"rows":[[{"v":new Date(2016, 8, 24, 12, 0),"f":"Saturday, September 24, 2016"},null,null,21,null,null,true],[{"v":new Date(2016, 8, 25, 12, 0),"f":"Sunday, September 25, 2016"},null,null,23,null,null,true],[{"v":new Date(2016, 8, 26, 12, 0),"f":"Monday, September 26, 2016"},null,null,19,null,null,true],[{"v":new Date(2016, 8, 27, 12, 0),"f":"Tuesday, September 27, 2016"},null,null,44,null,null,true],[{"v":new Date(2016, 8, 28, 12, 0),"f":"Wednesday, September 28, 2016"},null,null,54,null,null,true],[{"v":new Date(2016, 8, 29, 12, 0),"f":"Thursday, September 29, 2016"},null,null,39,null,null,true],[{"v":new Date(2016, 8, 30, 12, 0),"f":"Friday, September 30, 2016"},null,null,35,null,null,true],[{"v":new Date(2016, 9, 1, 12, 0),"f":"Saturday, October 1, 2016"},null,null,38,null,null,true],[{"v":new Date(2016, 9, 2, 12, 0),"f":"Sunday, October 2, 2016"},null,null,64,null,null,true],[{"v":new Date(2016, 9, 3, 12, 0),"f":"Monday, October 3, 2016"},null,null,46,null,null,true],[{"v":new Date(2016, 9, 4, 12, 0),"f":"Tuesday, October 4, 2016"},null,null,35,null,null,true],[{"v":new Date(2016, 9, 5, 12, 0),"f":"Wednesday, October 5, 2016"},null,null,34,null,null,true],[{"v":new Date(2016, 9, 6, 12, 0),"f":"Thursday, October 6, 2016"},null,null,34,null,null,true],[{"v":new Date(2016, 9, 7, 12, 0),"f":"Friday, October 7, 2016"},null,null,31,null,null,true],[{"v":new Date(2016, 9, 8, 12, 0),"f":"Saturday, October 8, 2016"},null,null,29,null,null,true],[{"v":new Date(2016, 9, 9, 12, 0),"f":"Sunday, October 9, 2016"},null,null,30,null,null,true],[{"v":new Date(2016, 9, 10, 12, 0),"f":"Monday, October 10, 2016"},null,null,31,null,null,true],[{"v":new Date(2016, 9, 11, 12, 0),"f":"Tuesday, October 11, 2016"},null,null,22,null,null,true],[{"v":new Date(2016, 9, 12, 12, 0),"f":"Wednesday, October 12, 2016"},null,null,40,null,null,true],[{"v":new Date(2016, 9, 13, 12, 0),"f":"Thursday, October 13, 2016"},null,null,63,null,null,true],[{"v":new Date(2016, 9, 14, 12, 0),"f":"Friday, October 14, 2016"},null,null,55,null,null,true],[{"v":new Date(2016, 9, 15, 12, 0),"f":"Saturday, October 15, 2016"},null,null,71,null,null,true],[{"v":new Date(2016, 9, 16, 12, 0),"f":"Sunday, October 16, 2016"},null,null,64,null,null,true],[{"v":new Date(2016, 9, 17, 12, 0),"f":"Monday, October 17, 2016"},null,null,84,null,null,true],[{"v":new Date(2016, 9, 18, 12, 0),"f":"Tuesday, October 18, 2016"},null,null,100,null,null,true],[{"v":new Date(2016, 9, 19, 12, 0),"f":"Wednesday, October 19, 2016"},null,null,null,null,null,true],[{"v":new Date(2016, 9, 20, 12, 0),"f":"Thursday, October 20, 2016"},null,null,null,null,null,true],[{"v":new Date(2016, 9, 21, 12, 0),"f":"Friday, October 21, 2016"},null,null,null,null,null,true],[{"v":new Date(2016, 9, 22, 12, 0),"f":"Saturday, October 22, 2016"},null,null,null,null,null,true],[{"v":new Date(2016, 9, 23, 12, 0),"f":"Sunday, October 23, 2016"},null,null,null,null,null,true]],"showHeadlines":false,"percentData":false,"colors":["#3f85f2"],"height":230} 

Как использовать preg_match, чтобы найти это? Я попытался

$data = preg_match('/^(var chartData = |; var htmlChart)\\/$/', $url2, $output_array); 
print_r($output_array); 

Я первый и последний ключевые слова, чтобы попытаться получить то, что между ними их (Бытие данные я хочу)

Я попытался с помощью phpliveregex, который на самом деле своего рода подобрать то, что Я хочу (найти строку var chartData) http://www.phpliveregex.com/p/hCB еще, когда я пытаюсь клонировать то, что он не работает.

Вопрос: Как я могу извлечь этот объект json (внутри переменной chartData) из трендов Google, используя preg_match(), потому что то, что я пробовал, не работает.

+0

Почему вы не просто с помощью json_decode и доступа к свойству напрямую? – useyourillusiontoo

+0

@useyourillusiontoo Невозможно сказать по крайне неопределенному заголовку вопроса. Но он пытается извлечь JSOX из какого-то JS/HTML, но его регулярное выражение несколько вымолото. (Это также не очень JSON.) – mario

ответ

2

Это должно быть полезно

preg_match('/chartData\s+=\s+\{(.+)\}/', $url2, $output_array); 
$charData = $output_array[0]; 
2

Проблема, похоже, связана с несколькими значениями в строке «JSON», которые выглядят как new Date(2016, 9, 14, 12, 0), которые содержат пробелы и не заключены между кавычками. Вы можете решить эту проблему, добавив кавычки вокруг них:

$str = preg_replace('~:(new Date\([^)]*\))~', ':"$1"', $str); 
$jsonArray = json_decode($str, true); 
+0

Неплохо, я не очень хорошо объясняю вещи. Мой фактический ответ касался получения данных JSON из строки html, на что ответил @Marcus. К счастью, однако вы ответили на это, потому что это было бы моей следующей проблемой! – ConorReidd