Получить данные JSON из Javascript var, который был создан с помощью функции PHP DomDocument () - PullRequest
0 голосов
/ 01 сентября 2018

В настоящее время я работаю над проектом, чтобы получить ссылки на скачивание видео Vimeo. Как вы знаете, Vimeo, как и YouTube, не поддерживает функцию прямой загрузки через API остальных. Поскольку я знаю, что Vimeo предоставляет ссылки CDN на ссылку ресурса их проигрывателя для встраивания по адресу https://player.vimeo.com/video/{videoId}, я создал простую функцию DomDocument для доступа к конкретному JavaScript, который содержит необходимые ссылки для загрузки. Вот мой код:

// Define the Vimeo ID
$vimeoVideoId = htmlspecialchars((int) $_GET["id"]);

// Create new DomDocument Object.
$vimeoObject = new DOMDocument();

// Load the HTML Vimeo Embed Url
$vimeoObject->loadHTMLFile("https://player.vimeo.com/video/" . $vimeoVideoId);

// Create new XPath Dom Object
$xpathObject = new DOMXPath($vimeoObject);

// Get all JavaScript Elements without src="" attributes of the Vimeo Embed URL 
Webpage
$getJavaScript = $xpathObject->query('//body//script[not(@src)]');

// Convert DomObject to Array with the help of iterator_to_array() Function.
$createArrayFromGetJavaScript = iterator_to_array($getJavaScript);

// Get rid of the first Array Part because the relevant content is in the 
second Array Part
$array_shift = array_shift($createArrayFromGetJavaScript);

// Output the JavaScript Content with Vimeo CDN Video Files
echo $createArrayFromGetJavaScript[0]->nodeValue;

Теперь, когда вы более внимательно посмотрите на сгенерированный вывод, вы увидите, что вся необходимая информация обернута в допустимый JSON, и этот действительный JSON является значением переменной r.

Допустимый JSON внутри переменной r - снимок экрана, который я имею в виду

Теперь мой вопрос. Приведенный выше код работает как надо, но как мне получить доступ к содержимому этой конкретной переменной? Потому что, когда я могу получить весь элемент JSON, я могу перебрать его через json_decode($json, true); в PHP. Есть ли способ сделать это. Я думал о чем-то вроде regex с preg_match или preg_match_all. Но я пока не знаю, как создать эту строку регулярного выражения или как вывести соответствующий контент. Хороший ресурс для начинающих также помог бы, потому что тогда я также могу кое-что узнать для будущих проектов. Я уже исследовал на этом немецком веб-сайте здесь: https://www.php -einfach.de / php-tutorial / regulaere-ausdruecke / Но здесь я могу только найти, если утверждения, которые говорят, хорошо, то, что вы ищете for находится в вашей строке, но нет примера, как его скачать. Я попробовал это с помощью echo preg_match (...); Но это только вывод 1. Так что было бы здорово, если бы вы могли немного помочь мне с этой проблемой.

Спасибо заранее. Пол

Update

Я пробовал этот код здесь, но теперь он ничего не выводит:

<?
header("Content-type: text/plain");
error_reporting(E_ALL);
ini_set('display_errors', 1);
// Define the Vimeo ID
$vimeoVideoId = htmlspecialchars((int) $_GET["id"]);

// Create new DomDocument Object.
$vimeoObject = new DOMDocument();

// Load the HTML Vimeo Embed Url
$vimeoObject->loadHTMLFile("https://player.vimeo.com/video/" . $vimeoVideoId);

// Create new XPath Dom Object
$xpathObject = new DOMXPath($vimeoObject);

// Get all JavaScript Elements without src="" attributes of the Vimeo Embed URL Webpage
$getJavaScript = $xpathObject->query('//body//script[not(@src)]');

// Convert DomObject to Array with the help of iterator_to_array() Function.
$createArrayFromGetJavaScript = iterator_to_array($getJavaScript);

// Get rid of the first Array Part because the relevant content is in the second Array Part
$array_shift = array_shift($createArrayFromGetJavaScript);

preg_match("/var r = ({.+})/", $createArrayFromGetJavaScript[0]->nodeValue, $extracted_json);
// $extracted_json now contains the json as a string.
$json = json_decode($extracted_json[1], true);
// $json now contains the json parsed as an object.
print_r($json);
?>

Вместо этого отображаются следующие ошибки:

Warning: DOMDocument::loadHTMLFile(): Unexpected end tag : iframe in 
https://player.vimeo.com/video/287117046, line: 1 in index.php on line 12

Warning: DOMDocument::loadHTMLFile(): Unexpected end tag : div in 
https://player.vimeo.com/video/287117046, line: 1 in index.php on line 12

Notice: Undefined offset: 1 in index.php on line 28

1 Ответ

0 голосов
/ 01 сентября 2018

Учитывая ваши комментарии к этому ответу, теперь я понимаю, что вы хотите извлечь данные json.

Шаг 1. Создайте регулярное выражение для извлечения данных json. Поскольку вы упомянули, что json хранится в переменной r, и учитывая тот факт, что json начинается с { -брейка и заканчивается } -брейком, мы можем использовать следующее регулярное выражение для захвата всего, что между ними, поскольку мы знаем, что регулярные выражения соответствуют первому длинному совпадению.

var r=({.+})

Шаг 2: Захватите совпадения с помощью PHP.

Для этого мы можем использовать функцию preg_match .

<?php
$inputstring = 'function() var r = {"cdn_url": ..", "request": {"files": {"dash": { "id": 654654654, "fps": 23}}}}';
preg_match("/var r=({.+})/", $inputstring, $extracted_json);
// $extracted_json now contains the json as a string.
$json = json_decode($extracted_json[1]);
// $json now contains the json parsed as an object.
?>

Полезные ссылки:

...