SAM: Aufsplitten und verfrachten in Array

Hallo,

irgendwie steh' ich gerade auf der Leitung. Ich komme einfach nicht
weiter:

Ich habe in meinem CGI-Skript(Perl) eine Variable $_ , die HTML-Code enthält (z.B. "<HTML><HEAD><TITLE>Hallo</TITLE> ...").

Ich möchte den HTML-Code jetzt in einen Array verfrachten, so dass das ganze danach folgendermaßen aussieht:

my @Tags = ("<HTML>","<HEAD>","<TITLE>","Hallo","</TITLE>");

Wie geh' ich dazu vor? Mach ich das mit dem Split-Befehl?

Danke

SAM

  1. Hallo,

    noch besser wäre eine Möglichkeit, mit der ich alle im CGI-Skript
    alle Links

    <a href="hier_steht_immer_was_anderes.htm">

    durch eine von mir vorgegebene Adresse ersetzen kann, z.B:

    <a href="hier_steht_jetzt_überall_das_gleiche.htm">

    Ich denke das ist bestimmt einfacher, oder?
    Wie gehe ich hierzu vor?

    Gruß

    SAM

  2. Hallo Sam,

    Ich habe in meinem CGI-Skript(Perl) eine Variable $_ , die HTML-Code enthält (z.B. "<HTML><HEAD><TITLE>Hallo</TITLE> ...").
    Ich möchte den HTML-Code jetzt in einen Array verfrachten, so dass das ganze danach folgendermaßen aussieht:
    my @Tags = ("<HTML>","<HEAD>","<TITLE>","Hallo","</TITLE>");
    Wie geh' ich dazu vor? Mach ich das mit dem Split-Befehl?

    Bei split() brauchst du halt immer einen eindeutigen Separator, also ein Zeichen oder eine Zeichenfolge, die zwischen allen zu trennenden Elementen gleich ist. Das ist in dem Beispiel so weit ich sehen kann jedoch nicht der Fall.

    Wenn es eine in Teilen bekannte Zeichenkette ist, kannst du es mit regulaeren Ausdruecken und Klammerung gemerkter Teile versuchen, also etwa so:

    $_ ~= /(<HTML>)(<HEAD>)(<TITLE>)(.*)(</TITLE>)/;

    Anschliessend hast du in den RegExpr-Variablen $1 bis $5 die Teilelemente stehen, und mit
    push(@Tags,$1,$2,$3,$4,$5);
    koenntest du die Teile in einen Array bekommen.

    Wenn du allerdings eine ganze, komplexe HTML-Datei auf diese Weise auseinandernehmen willst, funktioniert das kaum mehr. Dazu brauchst du einen richtigen "Parser", also ein Software-Modul, das den gesamten Strukturbaum der HTML-Datei systematisch auseinander nimmt. Dafuer gibt es in Perl vermutlich Module zum Einbinden (eigene Frage: gibt es das eigentlich - ein HTML-Parsing-Modul, also nicht das XML-Parsing-Modul?). Dann musst du dich allerdings mit der Verwendung des entsprechenden Moduls auseinandersetzen.

    viele Gruesse
      Stefan Muenz

    1. Hallo Stefan,

      ich denke es gibt das Modul HTML::TreeBuilder, mit dem müßte
      es doch eigentlich gehen, oder?

      use HTML::TreeBuilder;

      Gruß

      SAM

      Hallo Sam,

      Ich habe in meinem CGI-Skript(Perl) eine Variable $_ , die HTML-Code enthält (z.B. "<HTML><HEAD><TITLE>Hallo</TITLE> ...").
      Ich möchte den HTML-Code jetzt in einen Array verfrachten, so dass das ganze danach folgendermaßen aussieht:
      my @Tags = ("<HTML>","<HEAD>","<TITLE>","Hallo","</TITLE>");
      Wie geh' ich dazu vor? Mach ich das mit dem Split-Befehl?

      Bei split() brauchst du halt immer einen eindeutigen Separator, also ein Zeichen oder eine Zeichenfolge, die zwischen allen zu trennenden Elementen gleich ist. Das ist in dem Beispiel so weit ich sehen kann jedoch nicht der Fall.

      Wenn es eine in Teilen bekannte Zeichenkette ist, kannst du es mit regulaeren Ausdruecken und Klammerung gemerkter Teile versuchen, also etwa so:

      $_ ~= /(<HTML>)(<HEAD>)(<TITLE>)(.*)(</TITLE>)/;

      Anschliessend hast du in den RegExpr-Variablen $1 bis $5 die Teilelemente stehen, und mit
      push(@Tags,$1,$2,$3,$4,$5);
      koenntest du die Teile in einen Array bekommen.

      Wenn du allerdings eine ganze, komplexe HTML-Datei auf diese Weise auseinandernehmen willst, funktioniert das kaum mehr. Dazu brauchst du einen richtigen "Parser", also ein Software-Modul, das den gesamten Strukturbaum der HTML-Datei systematisch auseinander nimmt. Dafuer gibt es in Perl vermutlich Module zum Einbinden (eigene Frage: gibt es das eigentlich - ein HTML-Parsing-Modul, also nicht das XML-Parsing-Modul?). Dann musst du dich allerdings mit der Verwendung des entsprechenden Moduls auseinandersetzen.

      viele Gruesse
        Stefan Muenz

      1. Hallo Sam,

        ich denke es gibt das Modul HTML::TreeBuilder, mit dem müßte
        es doch eigentlich gehen, oder?
        use HTML::TreeBuilder;

        Hm - ein TreeBuilder ist aber eher das Gegenteil von dem, was hier noetig waere: naemlich ein TreeParser. Du willst ja keine neue HTML-Datei erzeugen, sondern eine vorhandene auseinanderfieseln, oder?

        viele Gruesse
          Stefan Muenz

        1. Mahlzeit!

          die diversen HTML-Scanner Packages, allen voran HTML::Parser (obacht: nicht HTML::Parse)

          noch besser wäre eine Möglichkeit, mit der ich alle im CGI-Skript
          alle Links [..] ersetzen

          wenn du sicher sein kannst, daß ein <a> tag immer in einer Zeile steht, dann geht's einfach mit s///

          perldoc perlre
          => look-ahead und look-back mal ansehen

          Grüße
             K@rl

    2. use Mosche;

      $_ ~= /(<HTML>)(<HEAD>)(<TITLE>)(.*)(</TITLE>)/;

      push(@Tags,$1,$2,$3,$4,$5);

      push(@Tags, ($_ ~= /(<HTML>)(<HEAD>)(<TITLE>)(.*)(</TITLE>)/));

      *SCNR* :-)

      use Tschoe qw(Matti);

  3. Hallo,

    Hmm, das ist jetzt ungetestet, aber ich denke es müßte funktionieren:
    my @Tags = split(/(<[^>]*>)/,$_);

    Erklärung:
    Ihc splitte an den Tags, also allem , was zwishcen dne spitzen Klammern steht, inklusive der selben.
    Wenn Du diese 'Trennzeichen'-Regex in runde Klammern steckst, dann werden diese 'Trennzeichen' durch split ebenfalls in die Liste aufgenommen.

    Ich denke zwar, daß es zwischendurch leere Arrayeinträge gibt, aber das kannst Du dann ja auch noch in einem weiteren Schritt eliminieren. Oder es fällt irgendeinem wirklichen Regex-Guru noch eine passendere Regex ein.

    Grüße
      Klaus