查找所有出现的地方,并用PHP替换其中之一

问题描述 投票:0回答:1

我将字符串中的所有重复出现替换为。我在做:

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?

谢谢!

php regex
1个回答
0
投票
我希望您会发布一个最小的示例html字符串和预期的输出,但是我想我已经理解了您的意思。

不要使用正则表达式来解析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>

© www.soinside.com 2019 - 2024. All rights reserved.