Tom: RegExpr klappt nicht

Hi,

ich schaffe es nicht, automatisch <!-- .... --> zu ignorieren.
Ich möchte gerne den Quelltext in eine Variable packen und Kommentare entfernen.

$inhalt =~ s/<!--.*?-->//g;

funktioniert aber nicht immer.

Was mache ich falsch?

Gruß,
Tom

  1. Hallo,

    $inhalt =~ s/<!--.*?-->//g;
    funktioniert aber nicht immer.

    Ich nehme mal an, dass manchmal auch Code mitgelöscht wird, oder nicht? Aufgrund deiner ungenauen Beschreibung kann ich das jetzt aber nicht so genau sagen.
    So viel ich weis, musst ein Bindestrich escaped werden, da er ja in Klassen eingesetzt wird zB a-z findet alle Kleinbuchstaben des Alphabets, also :

    $inhalt =~ s/<!--.+?-->//g;

    $xNeTworKx.

    1. Hallo,

      $inhalt =~ s/<!--.*?-->//g;
      funktioniert aber nicht immer.

      Ich nehme mal an, dass manchmal auch Code mitgelöscht wird, oder nicht? Aufgrund deiner ungenauen Beschreibung kann ich das jetzt aber nicht so genau sagen.
      So viel ich weis, musst ein Bindestrich escaped werden, da er ja in Klassen eingesetzt wird zB a-z findet alle Kleinbuchstaben des Alphabets, also :

      $inhalt =~ s/<!--.+?-->//g;

      Danke!
      Geht aber leider auch nicht.
      Wenn ich über mehrere Zeilen suche, brauche ich ein /m oder?

      1. Hallo,

        $inhalt =~ s/<!--.+?-->//g;

        Geht aber leider auch nicht.
        Wenn ich über mehrere Zeilen suche, brauche ich ein /m oder?

        sorry, mein Fehler. Es sollte natürlich :

        $inhalt =~ s/<!--.+?-->//sg;

        heißen, also mit "s"

        $xNeTworKx.

        1. Hallo,

          $inhalt =~ s/<!--.+?-->//g;

          Geht aber leider auch nicht.
          Wenn ich über mehrere Zeilen suche, brauche ich ein /m oder?

          sorry, mein Fehler. Es sollte natürlich :

          $inhalt =~ s/<!--.+?-->//sg;

          heißen, also mit "s"

          warum nimmst Du .+ statt .* ?
          Es kann doch auch null sein, d.h. so aussehen:

          <!---->

          oder?

          1. warum nimmst Du .+ statt .* ?
            Es kann doch auch null sein, d.h. so aussehen:

            <!---->

            oder?

            Stimmt, aber ich bin davon ausgegangen, dass so unlogische Sachen wie <!----> nicht dortstehen.

    2. Ich nehme mal an, dass manchmal auch Code mitgelöscht wird, oder nicht? Aufgrund deiner ungenauen Beschreibung kann ich das jetzt aber nicht so genau sagen.

      So viel ich weis, musst ein Bindestrich escaped werden, da er ja in Klassen eingesetzt wird zB a-z findet alle Kleinbuchstaben des Alphabets, also :

      Aber nur, wenn Du eckige Klammern drumherum schreibst, also [a-z]. Die Bindestriche machen hier also kein Problem.

      $inhalt =~ s/<!--.*?-->//g;
      funktioniert aber nicht immer.

      Ich nehme an, "funktioniert nicht immer" bedeutet, dass Kommentare ueber mehrere Zeilen nicht entfernt werden? Sofern in $inhalt der gesamte Dateiinhalt und nicht nur eine Zeile steht, wuerde der Modifier /s helfen, damit der . auch auf einen Zeilenumbruch matcht. Siehe perldoc perlre.

      Jedoch ist die Syntax von SGML-Kommentare etwas komplizierter als dass sie einfach mit <!-- anfangen und mit --> aufhoeren. In irgendeinem Perl-Modul hatte ich mal eine korrektere Variante des Kommentare-Entfernens gesehen, allerdings weiss ich jetzt leider nicht mehr, in welchem. Jedenfalls geht es darum, dass der Kommentar eigentlich schon nach dem zweiten -- zu Ende ist und mit einem weiteren -- nochmal anfangen kann. (Aber unter Vorbehalt, ist nur AFAIR. Verdammt, ich finde ums Verrecken den entsprechenden Thread im Archiv nicht wieder.)

      So long

      --
      Bier trinken fetzt!!!
  2. Hi,

    ich schaffe es nicht, automatisch <!-- .... --> zu ignorieren.
    Ich möchte gerne den Quelltext in eine Variable packen und Kommentare entfernen.

    $inhalt =~ s/<!--.*?-->//g;

    funktioniert aber nicht immer.

    Was mache ich falsch?

    Gruß,
    Tom

    Was passiert denn wenn du
    $inhalt =~ s/<!--(.*?)-->//g;
    machst ?

    Gruß
    alligator

    1. Vergiss es habs grad verplant ich dacht du wolltest in $inhalt den Kommentar haben...

      cu
      alligator

    2. Was passiert denn wenn du
      $inhalt =~ s/<!--(.*?)-->//g;
      machst ?

      was soll das bringen? dann speicherst Du den Kommentar selbst nur in $1

  3. Hi,

    ich schaffe es nicht, automatisch <!-- .... --> zu ignorieren.
    Ich möchte gerne den Quelltext in eine Variable packen und Kommentare entfernen.

    $inhalt =~ s/<!--.*?-->//g;

    funktioniert aber nicht immer.

    versuch mal:
    $inhalt =~ s/<!--(?:.*?)-->//migx;

    Reiner