PHP DOM заменяет элемент новым элементом

У меня есть объект DOM с загруженной разметкой HTML. Я пытаюсь заменить все теги встраивания, которые выглядят так:

<embed allowfullscreen="true" height="200" src="path/to/video/1.flv" width="320"></embed>

С тегом, подобным этому:

<a 
href="path/to/video/1.flv" 
style="display:block;width:320px;height:200px;" 
id="player">
</a>

У меня возникают проблемы с этим, и я не хочу использовать регулярное выражение для этого. Не могли бы вы мне помочь?

EDIT:

Это то, что у меня есть до сих пор:

         // DOM initialized above, not important
            foreach ($dom->getElementsByTagName('embed') as $e) {
                $path = $e->getAttribute('src');
          $width = $e->getAttribute('width') . 'px';
          $height = $e->getAttribute('height') . 'px';
          $a = $dom->createElement('a', '');
          $a->setAttribute('href', $path);
          $a->setAttribute('style', "display:block;width:$width;height:$height;");
          $a->setAttribute('id', 'player');
          $dom->replaceChild($e, $a); // this line doesn't work
      }

Ответы

Ответ 1

Легко найти элементы из DOM с помощью getElementsByTagName. Действительно, вы не хотели бы приближаться к регулярным выражениям для этого.

Если DOM, о котором вы говорите, это PHP DOMDocument, вы бы сделали что-то вроде:

$embeds= $document->getElementsByTagName('embed');
foreach ($embeds as $embed) {
    $src= $embed->getAttribute('src');
    $width= $embed->getAttribute('width');
    $height= $embed->getAttribute('height');

    $link= $document->createElement('a');
    $link->setAttribute('class', 'player');
    $link->setAttribute('href', $src);
    $link->setAttribute('style', "display: block; width: {$width}px; height: {$height}px;");

    $embed->parentNode->replaceChild($link, $embed);
}

Изменить редактирование:

$dom->replaceChild($e, $a); // this line doesn't work

Да, replaceChild берет новый элемент для замены - с первым аргументом и потомком, который будет заменен как второй. Это не так, как вы могли ожидать, но это согласуется со всеми другими методами DOM. Также это метод родительского node дочернего элемента, который нужно заменить.

(я использовал class not id, так как вы не можете иметь несколько элементов на одной странице, все называемые id="player".)