我将字符串中的所有重复出现替换为。我在做:
1)我从youtube网址获得了video_id。
preg_match('/embed\/([\w+\-+]+)[\"\?]/', $string,$video_id);
2)我通过添加url视频ID的amp-youtube删除iframe。
$string = preg_replace( '/<iframe\s+.*?\s+src=(".*?").*?<\/iframe>/',
'<amp-youtube data-videoid="'.$video_id[1].'" width="480" height="270" layout="responsive"></amp-youtube>', (str_replace("https://www.youtube.com/embed/","", $string)));
只发生一次就可以了。
但是如果我有多个iframe,可以。
preg_match_all('/embed\/([\w+\-+]+)[\"\?]/', $string,$video_id);
以获取字符串中的所有视频ID。
但是如何循环将每个ID添加到字符串中的每个amp-youtube data-videoid?
谢谢!
不要使用正则表达式来解析html。在存在现有iframe标记时进行迭代,并使用iframe的src值中准备好的子字符串将其替换为所需的标记。
代码:(Demo)
$html = <<<HTML
<div>
<p>
<iframe allowfullscreen="" class="media-element file-default" data-fid="2219" data-media-element="1" frameborder="0" height="360" src="https://www.youtube.com/embed/sNEJOm4hSaw" width="640"></iframe>
</p>
<p>
<iframe allowfullscreen="" class="media-element file-default" data-fid="2219" data-media-element="1" frameborder="0" height="360" src="https://www.youtube.com/embed/abcdefghijk" width="640"></iframe>
</p>
</div>
HTML;
$dom = new DOMDocument;
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
while ($iframe = $dom->getElementsByTagName('iframe')->item(0)) {
$amp = $dom->createElement('amp-youtube');
$amp->setAttribute('width', '480');
$amp->setAttribute('height', '270');
$amp->setAttribute('layout', 'responsive');
$amp->setAttribute('data-videoid', str_replace("https://www.youtube.com/embed/","", $iframe->getAttribute('src')));
$iframe->parentNode->replaceChild($amp, $iframe);
}
echo $dom->saveHTML();
输出:
<div> <p> <amp-youtube width="480" height="270" layout="responsive" data-videoid="sNEJOm4hSaw"></amp-youtube> </p> <p> <amp-youtube width="480" height="270" layout="responsive" data-videoid="abcdefghijk"></amp-youtube> </p> </div>