christian: punkt negieren??? RE

hallo,

ich schreibe mir gerade ein script was Pfade in einer website auf absolute pfade umwandelt. Jedenfalls pfade wie /bild.jpg in http://www.test.de/bild.jpg.

Allerdings will ich dabei erstmal relative Pfade ausschließen und dachte eigentlich durch folgenes Muster werden zwei punkte ignoriert, aber wenn ich es mache wird überhaupt kein Pfad geändert:

s/SRC ?= ?"[^.]^."/SRC="http://www.test.de$1"/gi

weiß jemand was ich falsch mache?

ps: vielleicht kann mir ja auch jemand ein tool empfehlen was auch relative Pfade umgenerieren kann.. weil sonst muss ich das wohl ins script einbauen.

grüße
christian

  1. hallo,

    bin inzwischen ein wenig weiter gekommen, das auschließen des Punktes hat funktioniert, wieso auf einmal weiß ich auch nicht genau:-)

    aber jetzt komme ich nicht mehr weiter:

    folgene Ausgangssituation:

    <IMG SRC="../bild.jpg" border="0" />
    <IMG SRC="bild.jpg" border="0" />
    <IMG SRC="/bild.jpg" border="0" />

    das soll umgewandelt werden in:

    <IMG SRC="../bild.jpg" border="0" />
    <IMG SRC="http://www.test.de/bild.jpg" border="0" />
    <IMG SRC="http://www.test.de/bild.jpg" border="0" />

    mein RE:

    $line =~ s/SRC ?= ?"[^.]/?(.*)[" ]/SRC="http://www.test.de/$1"/gi;

    sieht für eigentlich richtig aus nur leider kommt das bei raus:

    <IMG SRC="../bild.jpg" border="0" />
    <IMG SRC="http://www.test.de/bild.jpg" border="0" />
    <IMG SRC="http://www.test.de/ild.jpg" border="0" />
    ----------------------------^---------------------FEHLER

    warum verschlunkt er den ersten buchstaben beim letzten bild?

    grüße christian

    1. Hallo Namensvetter,

      <IMG SRC="../bild.jpg" border="0" />
      <IMG SRC="bild.jpg" border="0" />
      <IMG SRC="/bild.jpg" border="0" />

      das soll umgewandelt werden in:

      <IMG SRC="../bild.jpg" border="0" />
      <IMG SRC="http://www.test.de/bild.jpg" border="0" />
      <IMG SRC="http://www.test.de/bild.jpg" border="0" />

      mein RE:

      $line =~ s/SRC ?= ?"[^.]/?(.*)[" ]/SRC="http://www.test.de/$1"/gi;

      Besser:

      $line =~ s~src\s?=\s?("')([^.][^\1])\1~src=$1http://www.test.de/$2$1~ig;

      <IMG SRC="http://www.test.de/ild.jpg" border="0" />
      warum verschlunkt er den ersten buchstaben beim
      letzten bild?

      [^.] matcht auch auf ein Zeichen. Auf das b, in
      diesem Fall.

      Gruesse,
       CK

      --
      Death is God's way of telling you not to be such a wise guy.
      1. hallo,

        Besser:

        $line =~ s~src\s?=\s?("')([^.][^\1])\1~src=$1http://www.test.de/$2$1~ig;

        2 Sachen einmal:

        Gehört der teil ("') nicht so: (["'])?

        Und dann hab ich noch nicht genau verstanden was folgenes Macht:
        ([^.][^\1])\1

        (geht auch noch nicht richtig) Was macht das \1?

        grüße christian

        1. Hallo christian,

          *seufz* das naechste mal poste ich nicht mehr,
          wenn ich derart muede bin.

          $line =~ s~src\s?=\s?("')([^.][^\1])\1~src=$1http://www.test.de/$2$1~ig;

          2 Sachen einmal:

          Gehört der teil ("') nicht so: (["'])?

          Ja.

          Und dann hab ich noch nicht genau verstanden was folgenes Macht:
          ([^.][^\1])\1

          Der muss auch so heissen:

          ([^.].+?)\1

          (geht auch noch nicht richtig) Was macht das \1?

          \1 ist die Rueckwaertsreferenz auf die erste
          Klammer.

          Gruesse,
           CK

          --
          Nur die Weisesten und die Dümmsten können sich nicht ändern.
          1. hallo,

            Der muss auch so heissen:

            ([^.].+?)\1

            das geht danke... nur eine Sache fehlt noch hab schon hin und her probiert komm aber nicht drauf wie ichs auschließen kann:

            Ausgang:
            <IMG SRC="../bild.jpg" border="0" />
            <IMG SRC="/bild.jpg" border="0" />
            <IMG SRC="bild.jpg" border="0" />

            Ergebnis:
            <IMG SRC="../bild.jpg" border="0" />
            <IMG SRC="http://www.test.de//bild.jpg" border="0" />
            -----------------------------^-----------------------
            <IMG SRC="http://www.test.de/bild.jpg" border="0" />

            beim zweiten bild ist der slash jetzt doppelt und egal wie ich es mache, entweder es fehlt der erste Buchstabe, oder der Slash ist doppelt drin.

            hast du da ne lösung?

            grüße christian

            1. Hallo christian,

              <IMG SRC="/bild.jpg" border="0" />
              [...]
              <IMG SRC="../bild.jpg" border="0" />
              <IMG SRC="http://www.test.de//bild.jpg" border="0" />

              beim zweiten bild ist der slash jetzt doppelt
              und egal wie ich es mache, entweder es fehlt der
              erste Buchstabe, oder der Slash ist doppelt drin.

              hast du da ne lösung?

              s!//!/!g;

              Gruesse,
               CK

              --
              Keine Schneeflocke faellt je auf die falsche Stelle.
              1. s!//!/!g;

                tr!/!!s

                use Benchmark;

    2. hi christian!

      <IMG SRC="../bild.jpg" border="0" />
      <IMG SRC="bild.jpg" border="0" />
      <IMG SRC="/bild.jpg" border="0" />

      soll umgewandelt werden in:

      <IMG SRC="../bild.jpg" border="0" />
      <IMG SRC="http://www.test.de/bild.jpg" border="0" />
      <IMG SRC="http://www.test.de/bild.jpg" border="0" />

      $line=~s~src\s?=\s?"(?!.)/?(.+?)"~src="http://www.test.de/$1"~ig;
                           ^^
                           zero-width negative look-ahead (http://www.perldoc.com/perl5.8.0/pod/perlre.html#Extended-Patterns)

      prost
      seth

      [ot]
      ps. es hat mich verwirrt, dass die aufforderung "Sie haben mehr als 25% zitierte Zeilen in Ihrem Posting. Sind Sie sicher, dass Sie das Posting so abschicken wollen?" als frage formuliert ist. vielleicht ist es aber auch tatsaechlich eine frage und ich habe nur aus doofheit nicht den "ja-knopf" gefunden.
      hmmm, ich antworte einfach mal an dieser stelle mit einem deutlichen "ja!".

  2. hallo,

    ich schreibe mir gerade ein script was Pfade in einer website auf absolute pfade
    umwandelt. Jedenfalls pfade wie /bild.jpg in http://www.test.de/bild.jpg.

    Bereits alles durcheinander. "http://www.test.de/bild.jpg" ist kein Pfad.

    Ansonsten empfehle ich dir File::Spec und HTML::Parser. HTML mit regulären Ausdrücken zu verarbeiten ist ein _sehr_ kurzsichtiger Ansatz. Extrahiere lieber mit einem richtigen Parser die relevanten Informationen und verarbeite sie dann separat. Nicht alles auf einmal!