Op deze website gebruiken we cookies om content en advertenties te personaliseren, om functies voor social media te bieden en om ons websiteverkeer te analyseren. Ook delen we informatie over uw gebruik van onze site met onze partners voor social media, adverteren en analyse. Deze partners kunnen deze gegevens combineren met andere informatie die u aan ze heeft verstrekt of die ze hebben verzameld op basis van uw gebruik van hun services. Meer informatie.

Akkoord

Vraag & Antwoord

Webprogrammeren & scripting

[Shadowbox JS] Regexp aanpassen, wie helpt?

marientje
7 antwoorden
  • In ben op het moment de nieuwe Wordpress aan het testen, met daarbij een lijst aan interessante plugins. Hierbij hoort onder andere Shadowbox JS (plugin), een Lightbox/Thickbox/Smallbox-variant die niet alleen voor afbeeldingen maar ook voor audio en video werkt. Werkt allemaal "out-of-the-box" prima, maar nu wil ik graag ondersteuning integreren voor video van traileraddicts.com. Na het bestuderen van de code ben ik tot de conclusie gekomen dat de relevante bewerking afhangt van de volgende code:
    [code:1:c33e042274]$tube_pattern = '/<a(.*?)href=('|")([^>]*)(youtube\.com\/(watch|v\/)|video\.google\.com\/googleplayer.swf)(.*?)('|")(.*?)>/i';

    $master_pattern = '/<a(.*?)href=('|")([^>]*)(\.(bmp|gif|jpe?g|png|swf|flv|f4v|dv|moo?v|movie|mp4|asf|wmv?|avi|mpe?g|mp3|aac)('|")|(youtube\.com\/(watch|v\/)|video\.google\.com\/googleplayer.swf))(.*?)>/i';
    [/code:1:c33e042274]
    Nu ben ik een absolute leek op het gebied van regexps, dus wat hulp wordt enorm gewaardeerd. Ik loop net tegen dit probleem op en gezien het tijdstip ga ik niet meer aan de oplossing beginnen vandaag. Morgen hoop ik wat tests te kunnen draaien, maar als iemand mij een zetje in de goede richting kan geven, graag!

    Verder wens ik iedereen vast een hele fijne 2 en 3 oktoberviering, al zal dat de meesten van jullie niets zeggen. 8)

    - Bas
  • Kijk, in beide expressions zitten links die als videolinks mogen woden beschouwd. Eerst wat meuk maar daarna of youtube.com (met nog iets erachter) of (|) video.google.com/googleplayer.swf en dan nog iets erachter (de ID van de video).
    Hieraan toevoegen traileraddict.com is dus niet lastig:

    [code:1:b1818a94c3]$tube_pattern = '/<a(.*?)href=('|")([^>]*)(youtube\.com\/(watch|v\/)|video\.google\.com\/googleplayer.swf|traileraddict\.com)(.*?)('|")(.*?)>/i';[/code:1:b1818a94c3]

    Probleem gaat echter worden de verwerking ervan. Die zal verderop in het script staan (wellicht met preg_replace o.i.d.). Daar moeten ook de nodige wijzigingen (of eigenlijk: toevoegingen) worden gedaan. Probleem is nu bij traileraddict dat je niet simpelweg de URL kunt gebruiken om dat ding te embedden, de embed-url is namelijk significant anders (bij de embed-url wordt gebruik gemaakt van een nummer, bij de directe url van een naam). Gebruikers zouden dus de embed-url moeten invoeren (dat is een lastige constraint), of je zou de directe url moeten gaan inladen en daaruit de embed-url moeten vissen om vervolgens die alsnog in te voegen. Al met al volgens mij geen makkelijk proces.
    Het is aan jou wat je nu verder wilt en hoe ik je verder ga helpen.

    PS: ik loop er ook rond vanavond (en ben niet eens Leienaar)
  • [quote:f937faffbc="marientje"]Probleem gaat echter worden de verwerking ervan. Die zal verderop in het script staan (wellicht met preg_replace o.i.d.). Daar moeten ook de nodige wijzigingen (of eigenlijk: toevoegingen) worden gedaan.[/quote:f937faffbc]Dat valt allemaal wel mee. Het script bepaalt alleen óf er een Shadowbox-effect aan een link moet worden toegevoegd, daar wordt dan een rel-attribuut aan toegevoegd zodat de JavaScript-library zich daar aan kan koppelen. Verder wordt er niets veranderd aan de html.[quote:f937faffbc="marientje"]Probleem is nu bij traileraddict dat je niet simpelweg de URL kunt gebruiken om dat ding te embedden, de embed-url is namelijk significant anders (bij de embed-url wordt gebruik gemaakt van een nummer, bij de directe url van een naam). Gebruikers zouden dus de embed-url moeten invoeren (dat is een lastige constraint), of je zou de directe url moeten gaan inladen en daaruit de embed-url moeten vissen om vervolgens die alsnog in te voegen. Al met al volgens mij geen makkelijk proces.[/quote:f937faffbc]Mee eens. Gelukkig ben ik momenteel de enige die dit zal gaan doen en voor mij is die url achterhalen geen probleem. Wel goed om bij stil te staan als ik zoiets ook bij vrienden wil doorvoeren.

    Ik heb de traileraddict.com-links gegeneraliseerd tot twee standaardexpressies. De vormen zijn:
      [*:f937faffbc]http://www.traileraddict.com/emd/14429 [*:f937faffbc]http://www.traileraddict.com/player.swf?id=14429&e=y [/list:o:f937faffbc]Alleen de nummerieke waarde kan veranderen, maar in principe hoef ik alleen maar het begin van de url's te herkennen. Ik dacht dit zo op te lossen, maar dat werkt niet:[code:1:f937faffbc] $tube_pattern = '/<a(.*?)href=('|")([^>]*)(youtube\.com\/(watch|v\/)|video\.google\.com\/googleplayer.swf|www\.traileraddict\.com\/(player\.swf|emd\/))(.*?)('|")(.*?)>/i'; $master_pattern = '/<a(.*?)href=('|")([^>]*)(\.(bmp|gif|jpe?g|png|swf|flv|f4v|dv|moo?v|movie|mp4|asf|wmv?|avi|mpe?g|mp3|aac)('|")|(youtube\.com\/(watch|v\/)|video\.google\.com\/googleplayer.swf|www\.traileraddict\.com\/(player\.swf|emd\/)))(.*?)>/i'; [/code:1:f937faffbc]Als ik alleen de tweede variant wil afvangen dan werkt het wel: [code:1:f937faffbc]$tube_pattern = '/<a(.*?)href=('|")([^>]*)(youtube\.com\/(watch|v\/)|video\.google\.com\/googleplayer.swf|www\.traileraddict\.com\/player\.swf)(.*?)('|")(.*?)>/i'; $master_pattern = '/<a(.*?)href=('|")([^>]*)(\.(bmp|gif|jpe?g|png|swf|flv|f4v|dv|moo?v|movie|mp4|asf|wmv?|avi|mpe?g|mp3|aac)('|")|(youtube\.com\/(watch|v\/)|video\.google\.com\/googleplayer.swf|www\.traileraddict\.com\/player\.swf))(.*?)>/i'; [/code:1:f937faffbc] Wat doe ik nu verkeerd in mijn eerste set regexps? [quote:f937faffbc="marientje"]PS: ik loop er ook rond vanavond (en ben niet eens Leienaar)[/quote:f937faffbc] Marientje, alvast enorm bedankt voor je hulp! Mocht ik je vanavond in het Hooglandse Kerkgebied tegen het lijf lopen, dan krijg je een biertje van me. ;) - Bas
  • Fijn dat het zo kan werken. Bij mij werkt de eerste regexp wel voor beiden, hij ziet er ook goed uit.


    [offline]Veel plezier vanavond maar ik zal me toch meer in het centrum van Leiden begeven[/offline]
  • Is er een speciale reden dat er in de string "googleplayer.swf" (zie eerste post) de punt niet ge-escaped wordt? Dat stuk is uit de originele broncode gekopieerd en werkt ook, maar ik snap dan niet dat er überhaupt punten ge-escaped worden…

    - Bas
  • dat is wel raar. Op zich logisch dat het werkt want een . (\. in regexp) matcht natuurlijk op alles (. in regexp). Maar als de link googleplayerQswf was zou die volgens mij dus ook matchen.
    Nogmaals, bij mij werkt de eerste regexp op beide mogelijke links. Heb je in je tests andere voorbeelden gebruikt dan je hier hebt gepost? Of misschien ligt het toch ergens anders aan.

    Misschien wat meer debuggen, of er inderdaad geen match is e.d. Maar ik verwacht dat je je dat al wel gedaan hebt. Misschien moet je dan wat meer code plaatsen, dan kan ik even nader kijken.
  • Nader onderzoek (héél veel variabelen laten outputten naar html-comments) heeft me geholpen het probleem op te lossen. Het probleem zat inderdaad bij code verderop in het bestand, zoals Marientje al had gesuggereerd. Zie de twee onderstaande voorbeelden.
    [code:1:df72b0488a]$tube_pattern = '/<a(.*?)href=('|")([^>]*)(youtube\.com\/(watch|v\/)|video\.google\.com\/googleplayer.swf|www\.traileraddict\.com\/player\.swf|www\.traileraddict\.com\/emd\/)(.*?)('|")(.*?)>/i';[/code:1:df72b0488a][code:1:df72b0488a]$tube_pattern = '/<a(.*?)href=('|")([^>]*)(youtube\.com\/(watch|v\/)|video\.google\.com\/googleplayer.swf|www\.traileraddict\.com\/(player\.swf|emd\/))(.*?)('|")(.*?)>/i';[/code:1:df72b0488a]Het tweede voorbeeld is korter en daarom waarschijnlijk eleganter, maar introduceert ook twee extra ronde haken: [i:df72b0488a][b:df72b0488a]([/b:df72b0488a]player\.swf|emd\/[b:df72b0488a])[/b:df72b0488a][/i:df72b0488a], die uiteindelijk voor (door mij) onvoorziene resultaten zorgde. Verderop in de code wordt de url namelijk aangevuld en opnieuw opgebouwd, het zag er eerst zo uit:
    [code:1:df72b0488a]$tube_replace = '<a$1href=$2$3$4$6$7 ' . $tube_rel_attr . '$8>';[/code:1:df72b0488a]Eenmaal aangepast aan het nieuwe aantal variabelen werkt het tweede voorbeeld nu ook:
    [code:1:df72b0488a]$tube_replace = '<a$1href=$2$3$4$7$8 ' . $tube_rel_attr . '$9>';[/code:1:df72b0488a]Nu ik dit weet moet ik ook in staat zijn om in de toekomst extra ondersteuning in te bouwen voor andere sites. Hoe dan ook heeft dit me het een en ander over regexps geleerd.

    Voor de liefhebbers: Regular Expression Basics

    Ik beschouw dit als opgelost. Mijn dank gaat uit naar mijn grote redder: Marientje. Bedankt!

    - Bas

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.