PHP - preg_replace YouTube вставлять независимо от порядка - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь получить 3 элемента из кодов для встраивания YouTube, но иногда эти элементы не в том же порядке, а иногда код для встраивания содержит больше параметров.

Я бы хотел найти способизвлеките идентификатор видео, ширину и длину, чтобы создать интеграцию YouTube для AMP.

Пример встраивания:

<iframe width="560" height="315" src="https://www.youtube.com/embed/bpcNPHqs4ng" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

Должен быть преобразован в:

<amp-youtube data-videoid="bpcNPHqs4ng" width="560" height="315" 
layout="responsive"></amp-youtube>

Если бы встраивание всегда было одним и тем же, это было бы легко решить, но иногда код встраивания начинается с исходного кода, иногда с ширины, ... Так что в любом порядке, в котором я должен был бы захватить идентификатор, ширину и высоту.

Можно ли сделать это с помощью preg_replace в PHP?

Я попробовал это:

preg_replace('/<iframe width="([0-9]+)" height="([0-9]+)" src="https:\/\/www.youtube.com\/embed\/([A-Za-z0-9]+)" (.*)><\/iframe>/', '<amp-youtube data-videoid="$3" width="$1" height="$2" layout="responsive"></amp-youtube>', $article);

$ статья содержит всю статью, в которой используется встраивание YouTube.

Если DOM-парсер может сделать то же самое, для меня это тоже нормально, но я менее знаком с этим.

Спасибо

1 Ответ

0 голосов
/ 26 февраля 2019

Вот решение DOMDocument вашей проблемы с использованием DOMXPath для поиска iframe тегов, которые имеют атрибут src, который содержит youtube, изатем заменив их соответствующим <amp-youtube> элементом:

$doc = new DOMDocument();
$doc->loadHTML($article, LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($doc);
foreach ($xpath->query("//iframe[contains(@src, 'youtube')]") as $youtube) {
    // create a new node
    $node = $doc->createElement('amp-youtube');
    // set attributes
    $node->setAttribute('data-videoid', basename(parse_url($youtube->getAttribute('src'), PHP_URL_PATH)));
    $node->setAttribute('width', $youtube->getAttribute('width'));
    $node->setAttribute('height', $youtube->getAttribute('height'));
    $node->setAttribute('layout', 'responsive');
    // and now replace the old node
    $youtube->parentNode->replaceChild($node, $youtube);
}
echo $doc->saveHTML();

Вывод (для моих демонстрационных данных):

<html>
  <body>
    <div>some text</div>
    <iframe name="notyoutube" src="http://example.com"></iframe>
    <p>some more text</p> 
    <amp-youtube data-videoid="bpcNPHqs4ng" width="560" height="315" layout="responsive"></amp-youtube>
    <div>one last div</div>
  </body>
</html>

Демонстрация на 3v4l.org

...