Erik Möller: Größenbeschränkungen bei Formularen? (Perl)

Ich habe heute ca. 6 Stunden damit verbracht, mit Perl und OmniHttpd ein automatisiertes News-Update für die sich im Aufbau befindliche Website "Der Humanist" zu erarbeiten, d.h. die Redakteure sollen in der Lage sein, Meldungen per Formular auf die Hauptseite und die verschiedenen Rubriken zu laden (ähnlich einem Gästebuch mit ein paar Extra-Features). Archivierung und Paßwortschutz folgen später. Im Grunde funktioniert alles super, nur ein Problem habe ich: Die Größe der übergebenen Meldungen ist doch recht arg begrenzt.

Aufgrund der Formulareingaben wird ja eine URL erzeugt wie

http://www.humanist.de/cgi-bin/meincgi.cgi?Parameter=Test&Parameter2=Test&...

In dieser URL landet dann auch der gesamte übergebene Text. Ich vermute, daß daraus die Größenbeschränkung resultiert (ich lande bei ca. 7 K Maximum für ein Textarea-Formularfeld).

Nun die Frage: Gibt es eine Möglichkeit, dies zu umgehen?

Ich füge mal meinen gesamten Code bei. Falls jemand Lust und Zeit hat, drüberzuschauen, würde ich mich als Newbie natürlich auch über Kommentare zu Redundanzfreiheit und Optimierung freuen.

Mit freundlichen Grüßen

Erik Möller

#!/usr/bin/perl

if($ENV{'REQUEST_METHOD'} eq 'GET')
   {
    $Daten = $ENV{'QUERY_STRING'}
   }
  else
   {
    read(STDIN, $Daten, $ENV{'CONTENT_LENGTH'});
   }

@Formularfelder = split(/&/, $Daten);
  foreach $Feld (@Formularfelder)  
   {
    ($name, $value) = split(/=/, $Feld);  
    $value =~ tr/+/ /;
    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
    $value =~ s/<!--(.\n)*-->//g;      
    if ($value =~ /[\r]/)
     {
      $value =~ s/[\n][\r]/<p>/g;
      $value =~ s/[\n]/<br>/g;
      $value =~ s/<p><br>/<p>/g;      
     }    
    else
     {
      $value =~ s/[\n]/<p>/g;      
     }
    $value =~ s/ä/&auml;/g;
    $value =~ s/ö/&ouml;/g;
    $value =~ s/ü/&uuml;/g;
    $value =~ s/Ä/&Auml;/g;
    $value =~ s/Ö/&Ouml;/g;
    $value =~ s/Ü/&Uuml;/g;
    $value =~ s/ß/&szlig;/g;
    $value =~ s/--/&#150;/g;

$value =~ s/\\/@stern/g;
    $value =~ s/\\/@score/g;
    
    while($value =~ /\[^\]+\/)
    {      
     $value =~ s/\
([^\]+)\/<I>\1</I>/;
    }
    while($value =~ /\[^\]+\/)
    {
     $value =~ s/\
([^\]+)\/<B>\1</B>/;
    }

$value =~ s/@stern/\*/g;
    $value =~ s/@score/\_/g;
    
  
    $Formular[$i] = $name;  
    $i = $i + 1;
    $Formular[$i] = $value;  
    $i = $i + 1;
   }

print "Content-type: text/html\n\n";

if ($Formular[9] eq "true") {
  print "<HTML><BODY BGCOLOR="#EEEEEE">\n";
  print "<H2>Vorschau</H2>";  
  print "<div style="background-color:#000080;margin:0pt;border:none;">\n";
  print "<font size=+0 face="Arial" STYLE="color:white;">\n";
  print "<b>\ ".$Formular[1]." \· ".$Formular[3].":\n";
  print "<i>".$Formular[5]."</i></b></font>\n";
  print "</DIV><P><FONT FACE="Arial">\n";
  print $Formular[7];
  print "</FONT><P><HR><P>\n";
  $Daten =~ s/preview=true/preview=false/i;
  print "<B><A HREF="/cgi-bin/news.cgi?".$Daten."">Abschicken!</A> ";
  print "- <A HREF="javascript:history.back();">Zurück zur Eingabemaske</A></B>\n";
  print "</BODY></HTML>";
  exit;
}
  
$Datei = "../".($Formular[3] ne "Geld" ? $Formular[3] : "politik")."/newsfile.htm";
$Datei =~ tr/[A-Z]/[a-z]/;
$OldFile = $Datei;
$OldFile =~ s/newsfile.htm/oldnewsfile.htm/i;
$TempFile = $Datei;
$TempFile =~ s/newsfile.htm/tmpfile.dat/i;
&makenews;
$Datei = "../newsfile.htm";
$OldFile = "../oldnewsfile.htm";
$TempFile = "../tmpfile.dat";
&makenews;

sub makenews {
  if(open(NEWSFILE, "<".$Datei) == false)  { print "<HTML><BODY BGCOLOR="#EEEEEE"><H2>Fehler</H2><B>News-Datei nicht gefunden!</B><P><HR><P><I>NewsSubmitter V1.0</I></HTML></BODY>\n"; }
  open(NEWSFILE, "<".$Datei) die "News-Datei nicht gefunden!\n";
  open(TEMPFILE, ">".$TempFile);

while (<NEWSFILE>)
  {
    if ($_ ne "<!-- BEGIN NEWS -->\n") {
      print TEMPFILE $_;
    }else{
      print TEMPFILE "<!-- BEGIN NEWS -->\n";
      print TEMPFILE "<!-- BEGIN ITEM -->\n";
      print TEMPFILE "<div style="background-color:#000080;margin:0pt;border:none;">\n";
      print TEMPFILE "<font size=+0 face="Arial" STYLE="color:white;">\n";
      print TEMPFILE "<b>\ ".$Formular[1]." \· ".$Formular[3].":\n";
      print TEMPFILE "<i>".$Formular[5]."</i></b></font>\n";
      print TEMPFILE "</DIV><P><FONT FACE="Arial">\n";
      print TEMPFILE $Formular[7];
      print TEMPFILE "</FONT><P>\n";
      print TEMPFILE "<!-- END ITEM -->\n";
    }    
  }
  
close(NEWSFILE);
close(TEMPFILE);
rename($Datei,$OldFile) print "Problem!";
rename($TempFile,$Datei) print "Problem 2!";    
  
}
  
print "<HTML><BODY BGCOLOR="#EEEEEE"><H2>OK</H2><B>Erfolgreich gespeichert!</B>\n";
print "<P><HR><P><I>NewsSubmitter V1.0</I></HTML></BODY></HTML>";

  1. Hallo Erik!

    http://www.humanist.de/cgi-bin/meincgi.cgi?Parameter=Test&Parameter2=Test&...

    In dieser URL landet dann auch der gesamte übergebene Text. Ich vermute, daß daraus die Größenbeschränkung resultiert (ich lande bei ca. 7 K Maximum für ein Textarea-Formularfeld).

    Das ist wohl genau das Problem...

    Nun die Frage: Gibt es eine Möglichkeit, dies zu umgehen?

    Klar, einfach die Daten mit der "Post" anstatt mit der "Get"-Methode übergeben. Mit Post werden die Daten nicht in der URL sondern via STDIN an das Skript geschickt. Also:

    <form action="http://..." method="post">

    #!/usr/bin/perl

    if($ENV{'REQUEST_METHOD'} eq 'GET')
       {
        $Daten = $ENV{'QUERY_STRING'}
       }
      else
       {
        read(STDIN, $Daten, $ENV{'CONTENT_LENGTH'});
       }

    in diesem Teil des Skriptes wird bereits überprüft, ob die Daten per "Get" oder "Post" 'rüberkommen. Achtung: Bei manchen Webservern (imho Xitami unter Win) wird die Variable REQUEST_METHOD u.U. nicht gesetzt.

    Viele Grüße

    Andreas

    1. Klar, einfach die Daten mit der "Post" anstatt mit der "Get"-Methode übergeben. Mit Post werden die Daten nicht in der URL sondern via STDIN an das Skript geschickt. Also:

      Aha! So geht das also, vielen Dank. Jetzt würde ich gerne auf meiner Vorschau-Seite die Möglichkeit geben, die eingetragenen Daten nochmal zu bestätigen. Das hatte ich bisher so gemacht, daß ich einfach den Parameter-String mit einem geänderten Schluß-Parameter (&preview=false) als Link auf die neue Seite gesetzt habe. Nun könnte ich diesen String ja per Split zerlegen und als Value in Tags mit "INPUT TYPE=HIDDEN" einsetzen. Das ist allerdings ein bißchen aufwendig (und ich weiß gar nicht ob's funktioniert wg. der Sonderzeichen und der Größe), fällt Dir vielleicht eine einfachere Lösung ein? (OK, ein erfahrener Perl-Programmierer kann so etwas wahrscheinlich in eine halbe Zeile pressen ;-)

      MfG
      EMÖ

      1. Klar, einfach die Daten mit der "Post" anstatt mit der "Get"-Methode übergeben. Mit Post werden die Daten nicht in der URL sondern via STDIN an das Skript geschickt. Also:

        Aha! So geht das also, vielen Dank. Jetzt würde ich gerne auf meiner Vorschau-Seite die Möglichkeit geben, die eingetragenen Daten nochmal zu bestätigen. Das hatte ich bisher so gemacht, daß ich einfach den Parameter-String mit einem geänderten Schluß-Parameter (&preview=false) als Link auf die neue Seite gesetzt habe. Nun könnte ich diesen String ja per Split zerlegen und als Value in Tags mit "INPUT TYPE=HIDDEN" einsetzen. Das ist allerdings ein bißchen aufwendig (und ich weiß gar nicht ob's funktioniert wg. der Sonderzeichen und der Größe), fällt Dir vielleicht eine einfachere Lösung ein? (OK, ein erfahrener Perl-Programmierer kann so etwas wahrscheinlich in eine halbe Zeile pressen ;-)

        MfG
        EMÖ

        Wie wärs mit JavaScript ? und dem onSubmit-event ?

        Grüessli

        Anonymous

  2. Hi Erik!

    Ich füge mal meinen gesamten Code bei. Falls jemand Lust und Zeit hat, drüberzuschauen, würde ich mich als Newbie natürlich auch über Kommentare zu Redundanzfreiheit und Optimierung freuen.

    Mal schauen ...

    #!/usr/bin/perl

    [...]

    »»

    if ($value =~ /[\r]/)
         {
          $value =~ s/[\n][\r]/<p>/g;
          $value =~ s/[\n]/<br>/g;
          $value =~ s/<p><br>/<p>/g;

    Die eckigen Klammern kannst Du Dir hier sparen. Bei den RegularExpressions stehe sie
    für Auswahlen - also eines der angegebenen Zeichen. Da Du aber jeweils nur ein Zeichen
    angegeben hast ...

    [...]

    »»

    $value =~ s/ä/\ä;/g;
        $value =~ s/ö/\ö;/g;
        $value =~ s/ü/\ü;/g;
        $value =~ s/Ä/\Ä;/g;
        $value =~ s/Ö/\Ö;/g;
        $value =~ s/Ü/\Ü;/g;
        $value =~ s/ß/\ß;/g;

    Genau hier kannst Du von den Optionen Gebrauch machen:
     $value =~ s/([äöüÄÖÜ?])/\1;/g;

    [...]

    »»

    while($value =~ /\[^\]+\/)
        {      
         $value =~ s/\
    ([^\]+)\/<I>\1</I>/;
        }
        while($value =~ /\[^\]+\/)
        {
         $value =~ s/\
    ([^\]+)\/<B>\1</B>/;
        }

    Ich denke hier kannst Du auch mit dem 'g'-Flag arbeiten:
    $value =~ s/\([^\]+)\*/<I>\1</I>/g;
    $value =~ s/\([^\]+)\_/<B>\1</B>/g;

    [...]

    »»

    $Formular[$i] = $name;  
        $i = $i + 1;
        $Formular[$i] = $value;  
        $i = $i + 1;

    Hier mal gleich ganz viele Anmerkungen zu:

    Das hochzählen von i kannst Du durch ++ erledigen. Entweder mit '++ $i' oder '$i ++'.
    Wenn Du dieses Konstrukt noch weiterverarbeitest, kommen die Unterschiede zum tragen:
    Entweder erst erhöhen und dann den Wert holen oder andersherum.
    Für Dich heißt das einfach, daß Du zwei Arbeitschritte quasi einsparen kannst:
    $Formular[$i++] = $name;  
    $Formular[$i++] = $value;

    Wenn man den Zähler wegläßt kann man auch einfach die Werte hinten ins Array schieben:
    push(@Formular, $name, $value);

    Nun zu einem Problem:
    Bei CGI-Aufrufen kann und sollte man nicht davon ausgehen, daß die Variablen in einer
    bestimmten Reihenfolge angeliefert werden!
    Stattdessen lieber ein Hash benutzen. Dies ist ein Array mit Strings als Indizes. Der
    Variablenname wird der Index:
    $Formular{$name} = $value;
    Man beachte die geschweiften Klammern...
    Um die Werte später zu nutzen schreibt man dann zum Beispiel:
    print $Formular{'Parameter2'};

    [...]

    if ($Formular[9] eq "true") {

    s.o.

    print "<HTML><BODY BGCOLOR="#EEEEEE">\n";
      print "<H2>Vorschau</H2>";  
      print "<div style="background-color:#000080;margin:0pt;border:none;">\n";
      print "<font size=+0 face="Arial" STYLE="color:white;">\n";
      print "<b>\ ".$Formular[1]." \· ".$Formular[3].":\n";
      print "<i>".$Formular[5]."</i></b></font>\n";
      print "</DIV><P><FONT FACE="Arial">\n";
      print $Formular[7];
      print "</FONT><P><HR><P>\n";
      $Daten =~ s/preview=true/preview=false/i;
      print "<B><A HREF="/cgi-bin/news.cgi?".$Daten."">Abschicken!</A> ";
      print "- <A HREF="javascript:history.back();">Zurück zur Eingabemaske</A></B>\n";
      print "</BODY></HTML>";

    hier kann man ein wenig optimieren, indem man mit nur einem Print-Statement und einem
    sogenannten 'here-document' arbeitet:

    $Daten =~ s/preview=true/preview=false/i;
      print <<"END-OF-HTML";
    <HTML><BODY BGCOLOR="#EEEEEE">
    <H2>Vorschau</H2><div style="background-color:#000080;margin:0pt;border:none;">
    <font size=+0 face="Arial" STYLE="color:white;">
    <b>\ ${Formular{Parameter1}} \· ${Formular{Parameter2}}:
    <i>${Formular{Parameter3}}</i></b></font>
    </DIV><P><FONT FACE="Arial">
    ${Formular{Parameter4}</FONT><P><HR><P>
    <B><A HREF="/cgi-bin/news.cgi?$Daten">Abschicken!</A> - <A HREF="javascript:history.back();">Zurück zur Eingabemaske</A></B>
    </BODY></HTML>
    END-OF-HTML

    So viel erstmal dazu ...

    Gruß,
       Jörk

    1. hi!

      hier kann man ein wenig optimieren, indem man mit nur einem Print-Statement und einem
      sogenannten 'here-document' arbeitet:

      $Daten =~ s/preview=true/preview=false/i;
        print <<"END-OF-HTML";
      <HTML><BODY BGCOLOR="#EEEEEE">
      <H2>Vorschau</H2><div style="background-color:#000080;margin:0pt;border:none;">
      <font size=+0 face="Arial" STYLE="color:white;">
      <b>\ ${Formular{Parameter1}} \· ${Formular{Parameter2}}:
      <i>${Formular{Parameter3}}</i></b></font>
      </DIV><P><FONT FACE="Arial">
      ${Formular{Parameter4}</FONT><P><HR><P>
      <B><A HREF="/cgi-bin/news.cgi?$Daten">Abschicken!</A> - <A HREF="javascript:history.back();">Zurück zur Eingabemaske</A></B>
      </BODY></HTML>
      END-OF-HTML

      Bist du dir sicher, dass bei Hier-Dokumenten das " als Sonderzeichen maskiert werden muss? Macht doch eigentlich keinen Sinn an dieser Stelle.

      bye, Frank!

      1. Hi Frank!

        print <<"END-OF-HTML";
        <HTML><BODY BGCOLOR="#EEEEEE">
        END-OF-HTML

        Bist du dir sicher, dass bei Hier-Dokumenten das " als Sonderzeichen maskiert werden muss? Macht doch eigentlich keinen Sinn an dieser Stelle.

        Hast natürlich Recht! War mal wieder zu schnell gedacht von mir. Es gibt ja Unterschiede
        bei den Hier-Dokumenten (wie sie im Kamel-Buch hei?en ;-) zwischen einem ' und einem "
        im Aufruf. Wenn ich ein " benutze habe ich die Möglichkeit Variablen aber auch Sonderzeichen
        wie \n einzubauen (genauso wie in einem "..." String). Aber das " hat hier sicher keine Sonderbedeutung mehr.

        Wo wir gerade beim Thema Schnellschuß sind:

        ${Formular{Parameter4}</FONT><P><HR><P>

        hier muß es natürlich
        ${Formular{Parameter4}}</FONT><P><HR><P>
        heißen (habe eine } vergessen )

        Weiterhin "happy perling"
           Jörk

        1. hi!

          print <<"END-OF-HTML";
          <HTML><BODY BGCOLOR="#EEEEEE">
          END-OF-HTML
          Bist du dir sicher, dass bei Hier-Dokumenten das " als Sonderzeichen maskiert werden
          muss? Macht doch eigentlich keinen Sinn an dieser Stelle.
          Hast natürlich Recht! War mal wieder zu schnell gedacht von mir. Es gibt ja Unterschiede
          bei den Hier-Dokumenten (wie sie im Kamel-Buch hei?en ;-) zwischen einem ' und einem "
          im Aufruf. Wenn ich ein " benutze habe ich die Möglichkeit Variablen aber auch
          Sonderzeichen wie \n einzubauen (genauso wie in einem "..." String). Aber das " hat hier
          sicher keine Sonderbedeutung mehr.

          Natürlich hat das " auch bei Hier-Dokumenten eine Sonderbedeutung, und zwar die gleiche wie sonst auch: Variablen werden interpoliert und Sonderzeichen ausgewertet (oder maskiert). Allerdings ging es jetzt nur um die " in der Ausgabe: da der Text, der ausgegeben werden soll, ja nicht mehr von " eingeschlossen ist, sondern nur die Angabe der Marke, bis zu der ausgegeben werden soll, wäre es sinnlos, wenn man die " noch maskieren müsste, um sie auszugeben / keine Fehlermeldung zu erhalten.

          Hm... verständlich? ;))

          bye, Frank!

    2. Hallo Jörk!

      $value =~ s/ä/\ä;/g;
          $value =~ s/ö/\ö;/g;
          $value =~ s/ü/\ü;/g;
          $value =~ s/Ä/\Ä;/g;
          $value =~ s/Ö/\Ö;/g;
          $value =~ s/Ü/\Ü;/g;
          $value =~ s/ß/\ß;/g;

      Ich fürchte, da hat das Forum bzw. der Browser was verschluckt/konvertiert. Es handelt sich hier um eine Umwandlungsroutine der Umlaute in HTML-Entities, die SELFHTML entnommen ist (tgck.htm#a6). Ich weiß nicht, ob Deine Kurzdarstellung insofern noch anwendbar ist.

      while($value =~ /\[^\]+\/)
          {      
           $value =~ s/\
      ([^\]+)\/<I>\1</I>/;
          }
          while($value =~ /\[^\]+\/)
          {
           $value =~ s/\
      ([^\]+)\/<B>\1</B>/;
          }

      Ich denke hier kannst Du auch mit dem 'g'-Flag arbeiten:
      $value =~ s/\([^\]+)\*/<I>\1</I>/g;
      $value =~ s/\([^\]+)\_/<B>\1</B>/g;

      Das hatte ich ursprünglich versucht, bei Verschachtelung gab es aber Probleme. Er ist dann nicht in der Reihenfolge vorgegangen wie vorgesehen.

      Das hochzählen von i kannst Du durch ++ erledigen. Entweder mit '++ $i' oder '$i ++'.
      Wenn Du dieses Konstrukt noch weiterverarbeitest, kommen die Unterschiede zum tragen:
      Entweder erst erhöhen und dann den Wert holen oder andersherum.
      Für Dich heißt das einfach, daß Du zwei Arbeitschritte quasi einsparen kannst:
      $Formular[$i++] = $name;  
      $Formular[$i++] = $value;

      Richtig, da hätte ich als Java-Einsteiger auch drauf kommen können.

      Nun zu einem Problem:
      Bei CGI-Aufrufen kann und sollte man nicht davon ausgehen, daß die Variablen in einer
      bestimmten Reihenfolge angeliefert werden!
      Stattdessen lieber ein Hash benutzen. Dies ist ein Array mit Strings als Indizes. Der
      Variablenname wird der Index:
      $Formular{$name} = $value;
      Man beachte die geschweiften Klammern...
      Um die Werte später zu nutzen schreibt man dann zum Beispiel:
      print $Formular{'Parameter2'};

      Aha! Guter Tip, ich hatte mich schon gefragt, wie ich Probleme vermeide, wenn ich irgendwo ein Formularelement einfüge.

      print <<"END-OF-HTML";
      <HTML><BODY BGCOLOR="#EEEEEE">
      <H2>Vorschau</H2><div style="background-color:#000080;margin:0pt;border:none;">
      <font size=+0 face="Arial" STYLE="color:white;">
      <b>\ ${Formular{Parameter1}} \· ${Formular{Parameter2}}:
      <i>${Formular{Parameter3}}</i></b></font>
      </DIV><P><FONT FACE="Arial">
      ${Formular{Parameter4}</FONT><P><HR><P>
      <B><A HREF="/cgi-bin/news.cgi?$Daten">Abschicken!</A> - <A HREF="javascript:history.back();">Zurück zur Eingabemaske</A></B>
      </BODY></HTML>
      END-OF-HTML

      Sehr praktisch. Perl scheint genau die Features zu haben, die man braucht.

      Vielen Dank für die Hints!

      EMÖ

      1. Moin Erik!

        Ich fürchte, da hat das Forum bzw. der Browser was verschluckt/konvertiert. Es handelt sich hier um eine Umwandlungsroutine der Umlaute in HTML-Entities, die SELFHTML entnommen ist (tgck.htm#a6). Ich weiß nicht, ob Deine Kurzdarstellung insofern noch anwendbar ist.

        Dann sicherlich nicht mehr :(

        Ich denke hier kannst Du auch mit dem 'g'-Flag arbeiten:
        $value =~ s/\([^\]+)\*/<I>\1</I>/g;
        $value =~ s/\([^\]+)\_/<B>\1</B>/g;

        Das hatte ich ursprünglich versucht, bei Verschachtelung gab es aber Probleme. Er ist dann nicht in der Reihenfolge vorgegangen wie vorgesehen.

        Kannst Du denn mal einen solchen Problemfall aufzeigen?

        [...]

        Sehr praktisch. Perl scheint genau die Features zu haben, die man braucht.

        Perl ist vielleicht nicht DIE Sprache für alle Probleme, aber sobald man sich mit Texten
        herumschlagen darf (und HTML zählt ja auch dazu) hat man doch eine Menge Features,
        die einem das Leben leicht machen.

        Vielen Dank für die Hints!

        Gern geschehen,
            Jörk

        1. $value =~ s/\([^\]+)\*/<I>\1</I>/g;
          $value =~ s/\([^\]+)\_/<B>\1</B>/g;

          Das hatte ich ursprünglich versucht, bei Verschachtelung gab es aber Probleme. Er ist dann nicht in der Reihenfolge vorgegangen wie vorgesehen.

          Kannst Du denn mal einen solchen Problemfall aufzeigen?

          Wenn z.B. eine Textkette wie

          *_Kursiver_ Text* mit *fettem _Text_ kombiniert*

          gewandelt werden sollte, hat er teilweise die falschen Textketten zusammengefuegt, nach einem Muster der laengsten erkannten Textkette o.ae. - ist nicht so wichtig, loept ja jetzt. Vielleicht faellt Dir noch was zu dem Problem ein, CGI-Skripts mit einem Passwort vor Missbrauch zu schuetzen, da bin ich naemlich wirklich ratlos.

          Herzliche Gruesse

          EMÖ

          1. Hi Erik!

            $value =~ s/\([^\]+)\*/<I>\1</I>/g;
            $value =~ s/\([^\]+)\_/<B>\1</B>/g;

            Das hatte ich ursprünglich versucht, bei Verschachtelung gab es aber Probleme. Er ist dann nicht in der Reihenfolge vorgegangen wie vorgesehen.

            Kannst Du denn mal einen solchen Problemfall aufzeigen?

            Wenn z.B. eine Textkette wie

            *_Kursiver_ Text* mit *fettem _Text_ kombiniert*

            gewandelt werden sollte, hat er teilweise die falschen Textketten zusammengefuegt, nach einem Muster der laengsten erkannten Textkette o.ae. - ist nicht so wichtig, loept ja jetzt.

            Ich sehe aber auch hier keine Probleme. Nun ja, es gibt ja in Perl bekanntlich viele Wege, um zur Lösung zu gelangen ...
            $value = "*_Kursiver_ Text* mit *fettem _Text_ kombiniert*";
            $value =~ s/\([^\]+)\*/<I>\1</I>/g;
            $value =~ s/\([^\]+)\_/<B>\1</B>/g;
            funktioniert aber wunderbar!

            Jörk