PHP DOM заменяет элемент новым элементом - PullRequest
21 голосов
/ 07 июля 2010

У меня есть объект 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
      }

1 Ответ

35 голосов
/ 07 июля 2010

Найти элементы из 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".)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...