[PHP 5] Regex voor youTube filmpje

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Beste mensen, ik zit met een vreemd probleem wat ik maar niet opgelost krijg.

Kleine achtergrond;
We zijn een website aan het maken waarbij gebruikers een eigen profielpagina hebben. Op deze pagina kunnen gebruikers ook youTube filmpjes toevoegen. Om echter misbruik/hacken tegen te gaan willen we controleren of de ingevoerde embed/object code van youTube wel aan bepaalde standaarden voldoed. Ieder filmpje heeft namelijk dezelfde opzet en dimensies, allen het gedeelte in de links achter het domein verschilt.

De beste manier om dit te doen leek regex. Na wat onderzoek heb ik een regex pattern geschreven. Deze heb ik getest op http://www.supercrumbly.com/assets/html/phpregextester en hier werkte hij perfect. Echter in onze eigen website doet hij het niet.
Ziet iemand het probleem?

Hieronder de codes;

Pattern;
<object width="425" height="350"><param name="movie" value="http:\/\/www\.youtube\.com\/(.)*"><\/param><param name="wmode" value="transparent"><\/param><embed src="http:\/\/www\.youtube\.com\/(.)*" type="application\/x-shockwave-flash" wmode="transparent" width="425" height="350"><\/embed><\/object>
Script in PHP pagina;
PHP:
1
2
3
4
5
/**
     * Check voor valid youTube 
     */ 
    $pattern= '<object width="425" height="350"><param name="movie" value="http:\/\/www\.youtube\.com\/(.)*"><\/param><param name="wmode" value="transparent"><\/param><embed src="http:\/\/www\.youtube\.com\/(.)*" type="application\/x-shockwave-flash" wmode="transparent" width="425" height="350"><\/embed><\/object>';
    $valid = preg_match('/$pattern/',$_POST['youtube']); //$_Post['youtube'] bevat de ingevoerde youtube code

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Ikzelf zou dit probleem van een andere kant benaderen. Niet de gebruiker de vrijheid geven en dan proberen met regexps te beperken, maar de gebruiker beperken en dan zijn tekst uitbreiden. Als je al ubb codes gebruikt ([url] ed) dan kun je natuurlijk ook gewoon een [youtube=filmpjeid] toevoegen die je vervolgens zelf omzet naar een mooie embed tag.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Barracuda_82
  • Registratie: September 2001
  • Laatst online: 19-12-2024

Barracuda_82

mkTime(), not war!

Janoz schreef op woensdag 22 november 2006 @ 10:45:
Ikzelf zou dit probleem van een andere kant benaderen. Niet de gebruiker de vrijheid geven en dan proberen met regexps te beperken, maar de gebruiker beperken en dan zijn tekst uitbreiden. Als je al ubb codes gebruikt ([url] ed) dan kun je natuurlijk ook gewoon een [youtube=filmpjeid] toevoegen die je vervolgens zelf omzet naar een mooie embed tag.
Probleem is alleen dat de gebruikers van het systeem vaak niet zo goed zijn met computers. Enige dat ze nu moeten doen is de EMBED tag dat naast elk youtube filmpje staat in een textarea plakken. Ik denk dat we het met jouw oplossing alleen maar veel te moeilijk maken.

* Barracuda_82 werkt aan hetzelfde project als mvb_inside

Edit:
Overigens heb ik een dergelijk aanpak al een keer geprobeerd, maar dat is moeilijk te maken (om het ook nog eenvoudig te houden). Een embed tag ziet er namelijk zo uit:
code:
1
2
3
4
5
<object width="425" height="350">
<param name="movie" value="http://www.youtube.com/v/QDdkFkMUsMA"></param>
<param name="wmode" value="transparent"></param>
<embed src="http://www.youtube.com/v/QDdkFkMUsMA" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"></embed>
</object>


De URL van een filmpje ziet er zo uit:

code:
1
http://www.youtube.com/watch?v=QDdkFkMUsMA


Het was me gelukt om de URL te transformeren naar een EMBED URL, maar om een of ander reden werkt dat niet :S

[ Voor 30% gewijzigd door Barracuda_82 op 22-11-2006 10:52 ]


Acties:
  • 0 Henk 'm!

  • snoopy
  • Registratie: December 2000
  • Laatst online: 17-08 08:27
Ja, wat denk je zelf, in jouw stukje code staat '/$pattern/' tussen single quotes, strings tussen single quotes worden niet geparsed, dus zal je dit tussen double quotes moeten plaatsen, levert dus op

PHP:
1
$valid = preg_match("/$pattern/",$_POST['youtube']);

Acties:
  • 0 Henk 'm!

Verwijderd

@Barracuda, misschien best of both worlds... je ript uit de user input de parameters die je nodig hebt om je eigen <embed> te bouwen, en doet vervolgens wat Janoz voorsteld.

Acties:
  • 0 Henk 'm!

  • EnsconcE
  • Registratie: Oktober 2001
  • Laatst online: 19-06 00:07
snoopy schreef op woensdag 22 november 2006 @ 11:51:
Ja, wat denk je zelf, in jouw stukje code staat '/$pattern/' tussen single quotes, strings tussen single quotes worden niet geparsed, dus zal je dit tussen double quotes moeten plaatsen, levert dus op

PHP:
1
$valid = preg_match("/$pattern/",$_POST['youtube']);
waarom zou je quotes geruiken?

PHP:
1
2
3
4
5
/**
     * Check voor valid youTube 
     */ 
    $pattern= '/<object width="425" height="350"><param name="movie" value="http:\/\/www\.youtube\.com\/(.)*"><\/param><param name="wmode" value="transparent"><\/param><embed src="http:\/\/www\.youtube\.com\/(.)*" type="application\/x-shockwave-flash" wmode="transparent" width="425" height="350"><\/embed><\/object>/';
    $valid = preg_match($pattern,$_POST['youtube']); //$_Post['youtube'] bevat de ingevoerde youtube code


Je kan ook de gebruikers de hele link laten posten naar het filmpje, en die strip je vervolgens.

[ Voor 5% gewijzigd door EnsconcE op 22-11-2006 12:02 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dat is idd stom snoopy.
Maar ik heb ook al met dubbele quotes geprobeerd. Weet niet waarom er nu enkele stonden.

Ofwel, werkt nog steeds niet. Toch bedankt voor de inbreng.

Ensonce,
Heb de quotes weggehaald, maar het effect blijft natuurlijk precies hetzelfde als met dubbele quotes.

[ Voor 24% gewijzigd door Verwijderd op 22-11-2006 12:04 ]


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Waarschijnlijk voldoet je string niet aan je regexp vanwege magic quotes. Hier een scriptje wat het ID eruit sloopt, heb je veel meer aan, eventueel om te bouwen naar regexp:
PHP:
1
2
3
4
5
6
7
8
9
10
if (get_magic_quotes_gpc()) {
    $embed = stripslashes($_POST['embed']);
} else {
    $embed = $_POST['embed'];
}

$offset = strpos($embed, '.com/v/')+7;
$IDstring = substr($embed, $offset);
$end = strpos($IDstring, '"></param');
$YouTube_ID = substr($IDstring, 0, $end);

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt CodeCaster,

Het probleem is nu opgelost. Heb je methode gebruikt en een stukje uitgebreid.
Pagina: 1