lois: regexp

hi,

kann ich mit regexp folgendes problem lösen?

$insertdir = "http://ibin.net/bled/";

$line = '<a href="http://irgendwas.com/file.htm"><img src="images/pic.gif"></a>';

es geht jetzt darum, dass ich in allen zeilen eines files ($line nur als bsp) wo ein relativer pfad ist das $insertdir davorsetze.

$line =~ s/((href *= *["'])|(src *= *["'])|(url *())/"$1$insertdir"/ieg;

gibt aber in dem fall:

'<a href='http://ibin.net/bled/http://irgendwas.com/file.htm'><img src='http://ibin.net/bled/images/pic.gif'></a>'
          ^ sollte hier nicht eingefügt werden, da eh schon absolute url.

jemand eine idee, wie ich verhindern kann dass $insertdir auch vor absolute urls gesetzt wird?

lg, lois.

  1. Hi,

    jemand eine idee, wie ich verhindern kann dass $insertdir auch vor absolute urls gesetzt wird?

    indem Du nicht "plump" ersetzt, sondern analysierst. Es sei denn, es gelingt Dir, die RegExp so zu gestalten, dass eine absolute URI erkannt wird (bzw. eben gerade nicht).

    Cheatah

    --
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hi,

      hi,

      indem Du nicht "plump" ersetzt, sondern analysierst.

      schon klar

      Es sei denn, es gelingt Dir, die RegExp so zu gestalten, dass eine absolute URI erkannt wird (bzw. eben gerade nicht).

      das wärs eben.

      lg, lois

  2. Hi Lois,

    jemand eine idee, wie ich verhindern kann dass $insertdir auch vor absolute urls gesetzt wird?

    Ja, prüfe ob die Url ein relativer oder ein absolute Pfadangabe ist. Am besten, in dem du einfach den Anfang der Url auf http:// und ähnliche Protokolle prüfst (ftp, gopher nntp...).
    Ausserdem würde ich deinen regex nocheinmal überarbeiten, der ist noch nicht wirklich gut. Was soll eigentlich das e flag hinter deinem Regex? Ich sehe hier in diesem Fall keinen sinn dafür.

    Grüße Andres Freund

    --
    ss:) zu:) ls:} fo:) de:] va:) ch:| n4:& rl:° br:^ js:( ie:% fl:( mo:|
    1. Hi Lois,

      hi,

      Ja, prüfe ob die Url ein relativer oder ein absolute Pfadangabe ist. Am besten, in dem du einfach den Anfang der Url auf http:// und ähnliche Protokolle prüfst (ftp, gopher nntp...).

      ok, wollt nur wissen obs vielleicht auch in einer regexp geht

      Ausserdem würde ich deinen regex nocheinmal überarbeiten, der ist noch nicht wirklich gut.

      bitte um vorschläge

      Was soll eigentlich das e flag hinter deinem Regex? Ich sehe hier in diesem Fall keinen sinn dafür.

      sonst nimmt er mir das $1 nicht

      lg, lois

      1. Hi Lois,

        bitte um vorschläge

        s/(<\w{1,}[^>]{1,})(src|href)="([^"]{1,})"([^>]{0,}>)/$1 $2="$prefix$3"$4/g;#Irgendwie sieht das ein wenig krytisch aus;-)
        Wobei $prefix die Url ist, die davor stehen soll;

        sonst nimmt er mir das $1 nicht

        Sollte er aber eigentlich. e ist doch dafür da, dass man so sachen wie pack oder so einsetzten kann. Bei mir funktioniert es zumindest.

        Grüße Andres Freund

        --
        ss:) zu:) ls:} fo:) de:] va:) ch:| n4:& rl:° br:^ js:( ie:% fl:( mo:|
        1. Hi Lois,

          hi,

          s/(<\w{1,}[^>]{1,})(src|href)="([^"]{1,})"([^>]{0,}>)/$1 $2="$prefix$3"$4/g;

          damit hätte sich das mit der rätselaufgabe auch erledigt:)

          »»Irgendwie sieht das ein wenig krytisch aus;-)
          schaut gut aus :D

          sonst nimmt er mir das $1 nicht
          Sollte er aber eigentlich. e ist doch dafür da, dass man so sachen wie pack oder so einsetzten kann. Bei mir funktioniert es zumindest.

          hat mich auch gewundert...

          thx + lg, lois

  3. damit funktionierts:

    @items = split (/(href|src|url)/i, $line);
    for (@items) { s/(=? *["'(])/"$1$insertdir"/ie unless (/((file|https?|gopher|ftp)://)|(mailto:|news:)/i);}
    $line = join ("", @items);

    rätselaufgabe:
    das in einer einzigen regexp.

    lg, lois