php - PHP - preg_replace YouTube 嵌入,无论顺序如何
问题描述
我正在尝试从 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 解析器也能做到这一点,我也可以,但我对此不太熟悉。
谢谢
解决方案
这是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>
推荐阅读
- c++ - 未能找到存在于 std::wstring 中的 wchar_t
- myob - 使用 C# 在 MyOB 帐户中使用 API 创建采购订单
- node.js - Nginx 上的节点应用程序正在下载 index.html 而不是更新它
- scala - Spark - 为什么我在 Scala 的匹配案例中得到“找到:Int() required Integer”
- java - 在Tomcat6中设置认可目录
- r - R:函数在内部 IF 语句后停止
- c# - Xamarin.Android 和 RecordAudio:如何结合文件写入和其他任务
- javascript - 如果我不存储 Array.map 的返回值会怎样?
- html - 如何使滑块箭头更高
- javascript - 在 Javascript 中插入字符串 - 法语键盘