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 }
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.
The replaceChild() method is used to replace a node.
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"
.)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With