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>

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

ИЗМЕНИТЬ:

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

         // 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
      }
 19
Author: hakre, 2010-07-07

1 answers

Легко найти элементы из 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. Кроме того, это метод родительского узла дочернего узла, подлежащего замене.

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

 31
Author: bobince, 2010-07-07 13:26:25