Nakedsoul: [REGEX (schon wieder)] BilD url erkennen

Duration : 18 min<br>Url : http://www.example.com/video299545/on_the_couch<br><img src='http://img100.ex.com/videos/thumbs/c/a/a/caa8fb2cb749d325d5b65e3c8988c22c.20.jpg'><br><img src='http://img100.example.com/videos/thumbslll/c/a/a/caa8fb2cb749d325d5b65e3c8988c22c.20.jpg'><br><object width="510" height="400" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" USW....

ich muss allgemein die bildurl ermitteln sei es im "bbcode" form oder html ...

es soll immer nur die erste bild url erkannt werden.

dieses replace wird für ein mod eines vbulletin boards benötigt...

lösungsansatz:
preg_match('/(http.*?\.[^\'](?:jpg|gif|png))/i',$post['message'],$matches);

dies funktioniert bei herkömmlichen bild urls aber bei diesem beispiel oben nimmt er zu viel mit
und zwar fälschlicherweise das komplette ding sammt html:
http://img100.ex.com/videos/thumbs/c/a/a/caa8fb2cb749d325d5b65e3c8988c22c.20.jpg'><br><img src='http://img100.example.com/videos/thumbslll/c/a/a/caa8fb2cb749d325d5b65e3c8988c22c.20.jpg

wie kann ich es am besten begrenzen damit er nur diesen teil aufnimmt? jedoch soll es nicht speziel für diese url sein sondern so allgemein wie möglich trotzdem außer halt das die normalen html elemente nciht aufgenommen werden wie zb ' " < [ usw...

mfg
nakedsoul

  1. Hi,

    lösungsansatz:
    preg_match('/(http.*?\.[^\'](?:jpg|gif|png))/i',$post['message'],$matches);

    Erkläre bitte, welcher Teil dieses Musters was genau matchen soll.

    MfG ChrisB

    --
    “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
    1. Erkläre bitte, welcher Teil dieses Musters was genau matchen soll.

      ist unwichtig ich brauche nur den regex teil

      http.*?\.[^\'](?:jpg|gif|png
      er findest alle bild links von http bis alles dazwischen bis mit der endung jpg gif png ..

      hast du ein bessere lösung evt wo das da oben auch funzt?

      1. Hi,

        Erkläre bitte, welcher Teil dieses Musters was genau matchen soll.

        ist unwichtig

        Na dann ist ja gut.

        MfG ChrisB

        --
        “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
        1. Na dann ist ja gut.

          was soll mir dein spampost jetzt bringen? was zählt ist der teil hier

          http.*?\.(?:jpg|gif|png)

          welcher perfektioniert werden muss oben habe ich genau erklärt was erkannt werden soll und was nicht...

  2. Hi nochmal,

    außer halt das die normalen html elemente nciht aufgenommen werden wie zb ' " < [ usw...

    Eben so wie du schreibst,

    http, gefolgt von beliebig vielen NICHT ' " < [
    '~(http[^\[\]\'"<>]+\.(?:jpe?g|gif|png))~'

    gefolgt von einem Punkt, gefolgt von der Endung.

    Viel Erfolg!
    Jonny 5

    1. Eben so wie du schreibst,

      http, gefolgt von beliebig vielen NICHT ' " < [
      '~(http[^\[\]\'"<>]+\.(?:jpe?g|gif|png))~'

      gefolgt von einem Punkt, gefolgt von der Endung.

      sehr gut johny das brachte fast die gewünschte lösung die funktioniert! aber ein problem bleibt.

      _____________

      [URL="http://www.example.com/show/283/411567_5ed0970f0df4ee358a263c9ce3779d428c464362.jpg"][/URL][URL="http://www.example.com/thumbs/283/411567_5ed0970f0df4ee358a263c9ce3779d428c464362.jpg"]

      wenn ich so ein bbcode im forum habe wählt er fälschlicherweise die erste url welche aber kein direktes bildlink ist.

      Dies habe ich bei

      bei meinem preg_match funktion gelöst mit [^='"]
      d.h.  /[^=\'"](http[^\[\]\'"<>]+\.(?:jpe?g|gif|png))/i

      irgendwie klappt das aber bei meiem mod im forum welches preg replace benutzt nicht...

      wie kann ich verhindern das nichts weiteres mehr dazuerkannt wird vor http ?
      und warum funzt das nicht bei beiden . dieses regex bringt mich noch zum verzweifeln -.-

      1. Hi,

        möglicherweise wäre es sinnvoll, sich erst ausgiebiger mit der Materie zu beschaffen, das kann später einiges an Zeit sparen. Vorausgesetzt man braucht es dann öfter natürlich.

        aber ein problem bleibt.
        _____________
        [URL="http://www.example.com/show/283/411567_5ed0970f0df4ee358a263c9ce3779d428c464362.jpg"][/URL][URL="http://www.example.com/thumbs/283/411567_5ed0970f0df4ee358a263c9ce3779d428c464362.jpg"]

        wenn ich so ein bbcode im forum habe wählt er fälschlicherweise die erste url welche aber kein direktes bildlink ist.

        Dies habe ich bei
        bei meinem preg_match funktion gelöst mit [^='"]
        d.h.  /[^=\'"](http[^\[\]\'"<>]+\.(?:jpe?g|gif|png))/i

        wie kann ich verhindern das nichts weiteres mehr dazuerkannt wird vor http ?

        Hmm, das ist mir nicht ganz klar. Möchtest du nur bestimmte Links und man weiß, es kommt ein bestimmter Teil immer im String vor, so müßte man natürlich auch nur Links, die diesen String enthalten suchen.

        zb:

          
        $c = '[^\[\]\'"<>]+';  
        $s = '~http'.$c.'/(?:thumbs|blabla|blublu)/'.$c.'(?:jpe?g|gif|png)~'  
        
        

        Viel Erfolg,
        Jonny 5

        1. dieser regex code soll ja die benutzung des [IMG] BBcodes ersetzen im forum . und somit diesen überflüssig machen.

          [PHP] ^='"[/PHP]
          normalerweise sollte es doch so funktioniere?! -.-

          alles zwischen http außer wenn die zeichen... [1]'"<> bis jpe?g|gif|png soll erkannt werden. außer wenn vor dem http die zeichen ^=" sind..(wegen der verlinkungen mit [url="http.... usw)
          hat jemand noch einen vorschlag?


          1. ↩︎

  3. Moin Moin!

    Mal so am Rande: Eine URL, die auf .gif, .jpg oder .png endet, muß nicht notwendigerweise ein Bild liefern. Umgekehrt können auch URLs, die .gif/.jpg/.png gar nicht enthalten, durchaus Bilder liefern. Darüber hinaus kann es einen deutlichen Unterschied machen, ob eine .gif/.jpg/.png-URL mit oder ohne Query-String aufgerufen wird.

    Dieser Ansatz ist also generell kaputt, für "passend" konfigurierte Webserver kann er "zufällig" funktionieren.

    Und um HTML zu parsen, sind Regular Expressions absolut nicht geeignet. Der saubere Ansatz wäre also, einen HTML-Parser zu benutzen, die IMG-Tags herauszufischen und die Werte ihrer src-Attribute zu ermitteln. Je nach weiterer Verwendung müßtest Du dann ggf. noch überprüfen, ob der Attributwert eine gültige URL ist und die URL ggf. in eine absolute URL umwandeln.

    Alexander

    --
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
    1. Hallo Alexander,

      Dieser Ansatz ist also generell kaputt, für "passend" konfigurierte Webserver kann er "zufällig" funktionieren.

      offensichtlich hast du nicht erkannnt, daß der Fragesteller ein spezielles Problem hat. Er möchte keine Suchmaschine programmieren.

      Und um HTML zu parsen, sind Regular Expressions absolut nicht geeignet.

      Er will wohl auch kein HTML parsen, sondern ein paar Bilder, die einem speziellen Muster entsprechen herausfiltern. Der zu parsende Code dürfte aus einer überschaubaren Quelle stammen.

      Natürlich sind reguläre Ausdrücke hier durchaus effizient.

      Schöne Grüße,
      Jonny 5

      Moin Moin!

      Mal so am Rande: Eine URL, die auf .gif, .jpg oder .png endet, muß nicht notwendigerweise ein Bild liefern. Umgekehrt können auch URLs, die .gif/.jpg/.png gar nicht enthalten, durchaus Bilder liefern. Darüber hinaus kann es einen deutlichen Unterschied machen, ob eine .gif/.jpg/.png-URL mit oder ohne Query-String aufgerufen wird.

      Dieser Ansatz ist also generell kaputt, für "passend" konfigurierte Webserver kann er "zufällig" funktionieren.

      Und um HTML zu parsen, sind Regular Expressions absolut nicht geeignet. Der saubere Ansatz wäre also, einen HTML-Parser zu benutzen, die IMG-Tags herauszufischen und die Werte ihrer src-Attribute zu ermitteln. Je nach weiterer Verwendung müßtest Du dann ggf. noch überprüfen, ob der Attributwert eine gültige URL ist und die URL ggf. in eine absolute URL umwandeln.

      Alexander

      1. habe auch nun schon eine lösung erfunden welche für mich super funktioniert:

        (?<![="\'])(http[^\[\]\'"<>]+\.(?:jpe?g|gif|png))