@codenerd på twitter Mit seneste tweet:

PHP preg_replace: Erstat ugyldig Youtube HTML med Valid XHTML kode

Det har længe været kendt at den kode
Youtube spytter ud, og
som millioner af mennesker sætter ind på deres websites hver dag, ikke er gyldig XHTML kode. Lige så længe har løsningen været kendt, men
Youtube har intet ændret, så må vi jo gøre det selv selv.

Løsningen har fundet vej til mange udenlandske blogs herunder originalen Bernie Zimmermann,
men også danske blogs er den at finde på, fx Niels Gamborgs blog.
Koden fra Youtube er som bekendt:

PHP
1
2
3
4
5
<object width="425" height="350">
<param name="movie" value="http://www.youtube.com/v/7_6B6vwE83U"></param>
<embed src="http://www.youtube.com/v/7_6B6vwE83U" type="application/x-shockwave-flash" width="425" height="350">
</embed>
</object>

Løsningen for at gøre denne valid er simpelthen at fjerne embed delen da denne er et forældet Netscape tag, således får vi koden:

PHP
1
2
3
<object type="application/x-shockwave-flash" style="width:425px; height:350px;" data="http://www.youtube.com/v/7_6B6vwE83U">
<param name="movie" value="http://www.youtube.com/v/7_6B6vwE83U" />
</object>

Denne kode virker i alle moderne browsere og validerer samtidig både i XHTML Strict og XHTML 1.1. Så langt så godt, og ikke meget ny information 😀 – men forhistorien skal jo også være i orden. Det nye kommer her. Jeg har som mange andre bare sagt oh well, og indsat den ugyldige HTML fra Youtube, a) fordi jeg er doven når det kommer til sådan noget, b) fordi jeg er doven…. du kan nok se hvor det fører hen.

Løsningen er en simpel Preg_replace der kan erstatte den ugyldige kode med den valide, så når jeg udskriver mine blogindlæg kalder jeg følgende PHP:

PHP
1
2
3
4
5
6
7
<?php
//forudtager at blog indlægget er gemt i $blogindlaeg
echo preg_replace('#<object.*?>.*<param value="([^"].*)" name="movie" />.*</object>#si',
'<object type="application/x-shockwave-flash" width="425" height="350" data="$1">
<param name="movie" value="$1" /></object>',
$blogindlaeg);
?>

Koden søger automatisk efter object tagget og finder det parameter tag som indeholder stien til Youtube filmen, dette erstatter den med den valide XHTML kode og sætter Youtubelinket ind de rigtige steder. Jeg vil ikke gå i dybden med hvordan preg_replace og regular expressions fungerer, det gemmer vi til en anden gang.

Håber koden kan hjælpe nogle dovne hunde derude lige som mig, jeg gidder i hvert fald ikke sidde og ændre på Youtubes kode hver gang jeg sætter en video ind, så hellere gøre det når jeg outputter koden til brugeren!

Skriv en kommentar

Krævede felter er markeret med *.

*