[PHP] Replace embed object

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik probeer uit html embed objects te filteren en alleen de video code te krijgen. Ik voer een preg_replace uit en die werkt ook opzich. Alleen wanneer er meerdere embed objects staan pakt hij hem niet goed.

Mijn preg is:
PHP:
1
$preRegEx = '/<embed.*src="http:\/\/video\.google\.com\/googleplayer\.swf\?docid=([0-9]+)&[^>]+>.*?[^<]+<\/embed>/si';


Ik heb al meerdere dingen geprobeerd. Wanneer ik hem op Ungreedy zet haalt hij na de embed alles weg ook. Ik weet haast zeker dat ik iets verkeerds doe met die laatste </embed> maar ik weet niet hoe ik dit zo moet oplossen.

Als voorbeeld heb ik de volgende html code die hij moet doen:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$html = '<object width="464" height="392">
  <param name="movie" value="http://embed.break.com/NTQxMTQ1" />
  <param name="allowScriptAccess" value="always" />
  <embed src="http://embed.break.com/NTQxMTQ1" type="application/x-shockwave-flash" 
    allowScriptAccess=always width="464" height="392"></embed>
</object>
blablablakj kjsk j kdjckj kdjc jkdcjk kjdc <embed id="VideoPlayback" width="400px" height="326px" allowFullScreen="true" 
    src="http://video.google.com/googleplayer.swf?docid=3340274697167011147&hl=en&fs=true" 
    type="application/x-shockwave-flash"> </embed> ffvv fvfvfvf
    <object style="width:480px;height:400px;">
        <param name="movie" value="http://mediaservices.myspace.com/services/media/embed.aspx/m=39032195,t=1,mt=video,ap=1">

        </param><param name="allowFullScreen" value="true">

        </param><param name="allowScriptAccess" value="always">

        </param><param name="wmode" value="transparent">

        </param><embed src="http://mediaservices.myspace.com/services/media/embed.aspx/m=39032195,t=1,mt=video,ap=1" allowFullScreen="true" allowScriptAccess="always" wmode="transparent" type="application/x-shockwave-flash" style="width:480px;height:400px;" />
    </object> djncdjcn jnd
<embed src="http://blip.tv/play/AcPHF4TnbQ" type="application/x-shockwave-flash" width="640" height="390" 
    allowscriptaccess="always" allowfullscreen="true"></embed>';


Andere verbeteringen op mijn regex zijn ook welkom.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik weet ongeveer al waarom het niet goed gaat. De eerste .* is niet goed omdat hij dan gewoon gaat zoeken naar de eerste embed en daarna tot de google video. Nu moet ik dus zorgen dat hij binnen de <embed ........ > blijft als hij gaat zoeken alleen ik heb geen idee hoe dat gaat.

Acties:
  • 0 Henk 'm!

  • chris
  • Registratie: September 2001
  • Laatst online: 11-03-2022
Ik denk dat je die .*'s moet vervangen, dus zoiets:

PHP:
1
$preRegEx = '/<embed[^>]+src="http:\/\/video\.google\.com\/googleplayer\.swf\?docid=([0-9]+)&[^>]+>[^<]+<\/embed>/si';

Acties:
  • 0 Henk 'm!

  • Tjark
  • Registratie: Juni 2000
  • Laatst online: 18-09 23:26

Tjark

DON'T PANIC

code:
1
.*?

ipv
code:
1
.*

de ? maakt .* niet meer 'greedy'

*insert signature here


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Chris die van jou werkt perfect zo. Hij blijft nu binnen zijn eigen embed object. Bedankt

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben er toch nog niet helemaal. De embed werkt nu goed alleen nu ben ik bij de objects beland.
Als ik zo'n regex eroverheen laat gaan pakt hij de eerste object parameter en daarna de url en sluit af. Nu moet dus gebeuren dat hij de object parameter pakt van de url moet nemen.

Zie als voorbeeld de html code in mijn eerste post en dan het myspace object.
Mijn regex is:
PHP:
1
$preRegEx = '/<object[^>]+>.*src="http:\/\/mediaservices\.myspace\.com\/services\/media\/embed.aspx\/m=([0-9]+).*<\/object>/si';


Met deze regex pakt hij dus het eerste object (van de break) en gaat door tot de myspace url en haalt alles ertussen weg. Als ik hem op Ungreedy zet krijg ik alleen het eerste cijfer van de code terug.

Ik heb het idee dat ik moet aangeven dat hij binnen de object nog moet zoeken naar een param of de embed.

Acties:
  • 0 Henk 'm!

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12

SchizoDuckie

Kwaak

do NOT use regular expressions to parse html
Gebruik een DomDocument::loadHTML en wat xpath queries :) dan ben je veel sneller klaar :)

[ Voor 17% gewijzigd door SchizoDuckie op 06-08-2008 12:47 ]

Stop uploading passwords to Github!


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ShizoDuckie ik ben bezig met HTMLPurifier waar ze zelf al een filter hebben om YouTube films te checken. Nu ben ik bezig met zelf filters te maken voor andere videosites.

HTMLPurifier zorgt ervoor dat er geen XSS is als mensen html code posten op je website. Mijn bedoeling is dus om wanneer mensen een filmpje embedden ik eerst de videocode eruit strip en dan alle foute codes eruit strip en dan weer de video's terugzet in een goed object.

Ik weet niet of wat jij zegt is wat ik zoek aangezien ik er nog niet echt heel goed naar heb gekeken maar volgens mij zoek ik iets anders.

Voor meer info over de YouTube filter: http://htmlpurifier.org/docs/enduser-youtube.html

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik probeer nu gewoon eerst een object te vinden.

Mijn regex is:
PHP:
1
$preRegEx = '/<object[^(<\/object>)]+<\/object>/Uim';


Mijn bedoeling is dus dat de regex alles mag matchen in het object behalve </object> en dan moet stoppen bij object.

Dit werkt dus niet. Kan iemand mij uitleggen waarom hij niet de objects pakt?

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

[] is een karakterclass, [^(<\/object>)]+ betekent: match alle karakters behalve (, <, /, o, b, j, e, c, t, > en )

Wat jij wilt is meer dit:

code:
1
/<object (.+?)<\/object>/is

Intentionally left blank

Pagina: 1