Thomas Schmieder: Regulärer Ausdruck zum Austausch der FrameSrc

Hallo,

könntet Ihr mir bitte mal bei der Formulierung des regulären Ausdrucks zum Austausch der Frame-Sources helfen?

<frame src="head.htm" ...>

Der String <frame src="        " soll gesucht werden und das darin enthaltene head.htm gegen ein neues Ziel ausgetauscht werden.

Nun kann da ja leider auch < frame   src = " ... " stehen oder
                           <frame src= " ... " oder so.

Muss ich auf sonst noch was achten? Wo stecken die kleinen Gemeinheiten?

Liebe Grüße aus http://www.braunschweig.de

Tom

--
Intelligenz ist die Fähigkeit, aus Fehlern Anderer zu lernen und Mut die, eigene zu machen.
  1. Moin Moin !

    Space vs. Tab, upper- vs. lower case, mehrfache Spaces, CR und/oder LF statt Space, ...

    \s+ matcht 1 oder mehr whitespaces (space, TAB, CR, LF) (zumindest in Perl ;-) )
    \s* matcht 0 oder mehr white spaces

    /regexp/i matcht case-insensitiv

    [^A-Z] matcht alle Zeichen, die _nicht_ A-Z sind.

    Du brauchst etwas in der Art

    /<\s*frame\s*src=".*?"[^>]*>/

    Der Rest steht im Handbuch ...

    Alexander

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

      Du brauchst etwas in der Art

      /<\s*frame\s*src=".*?"[^>]*>/

      Meinst Du? Wenn ich ein Browser wäre, dann würde ich ein < frame ...> dem Autor hinter die Ohren knallen. <frame...> ist IMHO das einzige, was ich interpretieren würde. (Mal angenommen, ich würde mich dazu entschließen, Frames überhaupt zu schlucken *g*)

      preg_match_all ("/<frame.*?src="([^"]*)"[^>]*>/i", $text, $matches);

      => wenn der Ausdruck matched, dann stehen in $matches[1] _alle_ Frameurls drinnen.

      Du kannst natürlich noch zwischen das < und das f ein \s* machen, (das \ musst Du maskieren) aber IMHO ist das sinnfrei.

      Christian

      --
      Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
      1. Hallo nochmal,

        wer lesen kann, ist klar im Vorteil, ich weiß... :-( Du willst das ja austauschen und nicht matchen.

        preg_match_all ("/<frame.*?src="([^"]*)"[^>]*>/i", $text, $matches);

        $text = preg_replace ("/(<frame.*?src=")([^"]*)("[^>]*>)/i", '$1'.$newurl.'$3', $text);

        Wobei das natürlich _alle_ Frameurls in dem Text ersetzt.

        Du kannst natürlich noch zwischen das < und das f ein \s* machen, (das \ musst Du maskieren) aber IMHO ist das sinnfrei.

        Christian

        --
        Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
        1. Guten Abend noch einmal,

          so weit bin ich nun gekommen:

          <?PHP #### preg_replace.php ####

          $var = "<frame src="script.html" target="_blank">\n";
          $var.= "<frame  src="hallo.php" target="_blank">\n";

          $new = "getpage.php?page=";

          $new_var = preg_replace("/(<frame\s+src=")(\S*")/i","$1".$new."$2",$var);

          echo "<pre>";
          echo htmlspecialchars($new_var);
          echo "</pre>";

          ?>

          Und das funktioniert auch soweit, wei ich das wollte.

          a) Wo sind hier noch Fehler drin?
          b) wie kann ich Rückseicht nehmen auf die Fälle:

          b1)  <frame src="../../bilder/bild27.jpg">
          b2)  <frame src="http://www.kanngarnichtsein.de/file.php?id=22">

          und alle Spielarten daraus.

          Möchte das besonders Fabian und Mathew ans Herz legen.

          Liebe Grüße aus http://www.braunschweig.de

          Tom

          --
          Intelligenz ist die Fähigkeit, aus Fehlern Anderer zu lernen und Mut die, eigene zu machen.
          1. Hallöle zur Nacht,

            man kämpft sich so langsam durch. Da gibt es ja gemeine Sachen:

            schreibt doch einer:

            <img border="0" src"=sonstwas.jpg" ...>

            Nunn denn. Schritt Nummer 3:
            --------------------------------------------

            <?PHP  #### getpage.php ####

            $datei = "http://".$HTTP_GET_VARS["page"];
            //echo dirname($HTTP_GET_VARS["page"]);
            $path=$HTTP_GET_VARS["page"];
            $dir=dirname($HTTP_GET_VARS["page"])."/";

            $fh = fopen($datei,"r");
            if(!$fh) die("hat nicht geklappt");

            $site="";
            $i=0;
            while (($block=fread($fh,512)) and ($i++ < 20))  // was ist hier mit der Größenangabe ?
            {
              $site.=$block;

            }
            fclose($fh);

            $new = "getpage.php?page=";

            $site = preg_replace("/(<frame\s+src=")(\S*")/i","$1".$new.$path."$2",$site);
            $site = preg_replace("/(<img\s+.*\s*src=")(\S*")/i","$1".$new.$dir."$2",$site);
            $site = preg_replace("/(<body\s+.*\s*background=")(\S*")/i","$1".$new.$dir."$2",$site);

            echo $site;

            ?>
            -----------------------------------------------------------------
            Wo könnten denn noch überall Referenzen drinstecken?

            <a href=" ...."
            <table
            und nicht zuletzt in CSS. oder?

            Liebe Grüße aus http://www.braunschweig.de

            Tom

            --
            Intelligenz ist die Fähigkeit, aus Fehlern Anderer zu lernen und Mut die, eigene zu machen.
      2. Moin Moin !

        /<\s*frame\s*src=".*?"[^>]*>/

        Meinst Du? Wenn ich ein Browser wäre, dann würde ich ein < frame ...> dem Autor hinter die Ohren knallen. <frame...> ist IMHO das einzige, was ich interpretieren würde. (Mal angenommen, ich würde mich dazu entschließen, Frames überhaupt zu schlucken *g*)

        OK, Opera und der Validator vom W3C geben Dir recht. Der Tag-Name muß direkt nach der öffnenden Klammer kommen.

        preg_match_all ("/<frame.*?src="([^"]*)"[^>]*>/i", $text, $matches);

        Nein, nicht ganz:

        <frame><img src="...">

        würde Dein Ausdruck auch finden. .*? müßte eigentlich [^>]*? heißen. Wenn aber in jedem Frame-Tag garantiert ein src-Attribut vorkommt, geht Dein Ausdruck auch.

        Du kannst natürlich noch zwischen das < und das f ein \s* machen, (das \ musst Du maskieren) aber IMHO ist das sinnfrei.

        Richtig.

        Alexander

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

          Nein, nicht ganz:

          <frame><img src="...">

          würde Dein Ausdruck auch finden. .*? müßte eigentlich [^>]*? heißen. Wenn aber in jedem Frame-Tag garantiert ein src-Attribut vorkommt, geht Dein Ausdruck auch.

          Da ein <frame> nur innerhalb eines framesets vorkommen kann, ist dieses Beispiel ziemlich sinnfrei...

          Gruß,
          dimde

          1. Moin Moin !

            Da ein <frame> nur innerhalb eines framesets vorkommen kann, ist dieses Beispiel ziemlich sinnfrei...

            Ja, richtig. Es ging jetzt auch schon in die Richtung RegExp-Theorie. Das Pattern von Christian (.*?) paßte eben nur "zufällig auch", mein Pattern ([^>]*?) paßt "genau".

            "Ich bin kein Pedant. Ich mag es eben nur nicht, wenn Gegenstände auf meinem Schreibtisch nicht senkrecht ausgerichtet sind." (Dieter Nuhr ?)

            Im Ernst: Warum eine unsaubere Lösung, die "nur zufällig" funktioniert, wenn eine saubere Lösung ohne nennenswerten Mehraufwand eben garantiert funktioniert, auch wenn die Eingabedaten nicht ganz ok sind?

            Gerade bei Benutzereingaben und Meßdaten sollte man immer das Unerwartete erwarten.

            Alexander

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

      Space vs. Tab, upper- vs. lower case, mehrfache Spaces, CR und/oder LF statt Space, ...

      \s+ matcht 1 oder mehr whitespaces (space, TAB, CR, LF) (zumindest in Perl ;-) )
      \s* matcht 0 oder mehr white spaces

      /regexp/i matcht case-insensitiv

      case-insensitiv hätte ich vergessen.

      [^A-Z] matcht alle Zeichen, die _nicht_ A-Z sind.

      Du brauchst etwas in der Art

      /<\s*frame\s*src=".*?"[^>]*>/

      Und das eigentlich Probelm warum ich überhaupt gefragt hatte, hab ich glatt vergessen. Das was da zwischen den "" steht, darf natürlich nicht verloren gehen, sondern muss dem Script zur Verfügung stehen. Und in einem Frameset können ja auch mehrere solche Ersetzungen notwedig werden. Da muss dann jedesmal, das was dazwischen steht in die Ersetzung wieder eingebaut werden.

      da soll dann nacher also stehen  <frame src="getpage.php?<domain>/alterFrameInhalt" ... >

      Den alten Inhalt müsste man ja eigentlich ohne urlencode() hinten dranhängen dürfen. Es ist doch davon auszugehen, dass er schon vernünftig encoded war...

      Liebe Grüße aus http://www.braunschweig.de

      Tom

      --
      Intelligenz ist die Fähigkeit, aus Fehlern Anderer zu lernen und Mut die, eigene zu machen.