PHP - preg_replace YouTube 嵌入,无论顺序如何

2024-04-19

我试图从 YouTube 嵌入代码中捕获 3 个元素,但有时这些元素的顺序不同,或者有时嵌入代码包含更多参数。

我想找到一种方法来提取视频 ID、宽度和长度,以便为 AMP 创建 YouTube 集成。

嵌入示例:

<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>

如果嵌入始终相同,那么很容易解决,但有时嵌入代码从源开始,有时从宽度开始,...所以无论什么顺序我都需要捕获 ID、宽度和高度。

我可以使用 PHP 中的 preg_replace 来做到这一点吗?

我试过这个:

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);

$article 包含使用 YouTube 嵌入内容的整篇文章。

如果 DOM 解析器可以做同样的事情,对我来说也可以,但我对此不太熟悉。

Thanks


这是一个DOMDocument http://php.net/manual/en/class.domdocument.php解决你的问题,使用DOMXPath http://php.net/manual/en/class.domxpath.php寻找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 上的演示 https://3v4l.org/lNUY5

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP - preg_replace YouTube 嵌入,无论顺序如何 的相关文章

随机推荐