When you make a web application that let the user insert video embeds coming from YouTube or from Vimeo, or what ever else, there is the problem of the embed size. In fact the object tag (iframe, embed, object) can damage your template and that’s not nice.
You can try to handle the input and the best thing (and also the simplest) you can do is to use regular expression to extract the aspect ratio of the video, remove unwanted tags (such as p tag after the embed that tell the origin of the video) and change the dimensions as you need for your site, preserving template.
I’ve made this function that receive the input $video string that contains the dirty embed code as it is from youtube. The second parameter $new_width (if specified) permits to resize the embed code proportionally to the width you need for your template.
This function removes also unwanted tags added after the important tag (such as happens from Vimeo embeds that have a p tag after the iframe).
function resizeEmbed($video,$new_width='') { $video = real_strip_tags($video,array('iframe','embed','param','object'),true); preg_match("/width=\"([^\"]*)\"/i",$video,$w); $w = (integer)$w[1]; preg_match("/height=\"([^\"]*)\"/i",$video,$h); $h = (integer)$h[1]; if (!$new_width) $new_width = $w; $w2 = $new_width; $ratio = (float)($w2/$w); $h2 = (integer)($h * $ratio); $video = str_replace("width=\"$w\"","width=\"$w2\"",$video); $video = str_replace("height=\"$h\"","height=\"$h2\"",$video); return array("embed"=>$video,"w"=>$w2,"h"=>$h2,"w0"=>$w,"h0"=>$h); }
As you can see this function uses also this “real strip tags” function that I’ve found on the php.net site:
function real_strip_tags($i_html, $i_allowedtags = array(), $i_trimtext = FALSE) { if (!is_array($i_allowedtags)) $i_allowedtags = !empty($i_allowedtags) ? array($i_allowedtags) : array(); $tags = implode('|', $i_allowedtags); if (empty($tags)) $tags = '[a-z]+'; preg_match_all('@</?\s*(' . $tags . ')(\s+[a-z_]+=(\'[^\']+\'|"[^"]+"))*\s*/?>@i', $i_html, $matches); $full_tags = $matches[0]; $tag_names = $matches[1]; foreach ($full_tags as $i => $full_tag) { if (!in_array($tag_names[$i], $i_allowedtags)) if ($i_trimtext) unset($full_tags[$i]); else $i_html = str_replace($full_tag, '', $i_html); } return $i_trimtext ? implode('', $full_tags) : $i_html; }
Great post. For a more low-level explanation about how to actually get the code to embed videos, I wrote up this post recently: http://fatwalr.us/2010/12/how-to-embed-resize-youtube-video/