Найти все вхождения и заменить одно на другое PHP - PullRequest
1 голос
/ 17 февраля 2020

Я заменяю все вхождения в строке на. И я делаю:

1) Я получаю video_id от URL-адреса YouTube.

preg_match('/embed\/([\w+\-+]+)[\"\?]/', $string,$video_id);

2) Я удаляю iframe с помощью amp-youtube, добавляя идентификатор видео URL.

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

, чтобы получить все идентификаторы видео в строке .

Но как я могу oop добавить каждый идентификатор к каждому видео-видео amp-youtube в строке ??

Спасибо !!

1 Ответ

0 голосов
/ 17 февраля 2020

Я бы sh вы бы опубликовали минимальный образец строки html и ожидаемый результат, но я думаю, что я понял ваше значение.

Не используйте регулярные выражения для анализа html. Выполните итерацию, пока существует существующий тег iframe, и замените его нужным тегом, используя подготовленную подстроку из значения sr c iframe.

Код: ( 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...