Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP DOM replace element with a new element

Tags:

dom

php

I have a DOM object with loaded HTML markup. I'm trying to replace all embed tags that look like this:

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

With a tag like this:

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

I'm having troubles figuring this out and I don't want to use regular expression for this. Could you help me out?

EDIT:

This is what I have so far:

         // 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       } 
like image 851
Richard Knop Avatar asked Jul 07 '10 13:07

Richard Knop


People also ask

How do you replace an element in a dom?

To replace a DOM element in the DOM tree, you follow these steps: First, select the DOM element that you want to replace. Then, create a new element. Finally, select the parent element of the target element and replace the target element by the new element using the replaceChild() method.

Which method is used to replace nodes?

The replaceChild() method is used to replace a node.


1 Answers

It's easy to find elements from a DOM using getElementsByTagName. Indeed you wouldn't want to go near regular expressions for this.

If the DOM you are talking about is a PHP DOMDocument, you'd do something like:

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

Edit re edit:

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

Yeah, replaceChild takes the new element to replace-with as the first argument and the child to-be-replaced as the second. This is not the way round you might expect, but it is consistent with all the other DOM methods. Also it's a method of the parent node of the child to be replaced.

(I used class not id, as you can't have multiple elements on the same page all called id="player".)

like image 178
bobince Avatar answered Sep 19 '22 23:09

bobince