我正试图从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解析器可以做同样的事情,对我来说也可以,但是我对此不太熟悉。
谢谢
答案 0 :(得分:2)
这是您的问题的DOMDocument
解决方案,使用DOMXPath
搜索具有包含iframe
的{{1}}属性的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();