Re: Sorry, "kleiner" Interpunktionsfehler: Re: @Perl-Profis/ regex - baseportal Forum - Web-Anwendungen einfach, schnell, leistungsfähig!
baseportal
English - Deutsch "Es gibt keine dummen Fragen - jeder hat einmal angefangen"

 baseportal-ForumDie aktuellsten 10, 30, 50, 100 Einträge anzeigen.  

 
 Ausgewählter Eintrag: Zur Liste 
    Beitrag von hempelr (1976 Beiträge) am Donnerstag, 14.August.2003, 13:09.
    Re: Sorry, "kleiner" Interpunktionsfehler: Re: @Perl-Profis/ regex

      mhm - warte mal, du willst also nur die Eingabe überprüfen und wenn sie falsch ist eine spezielle Fehlermeldung in die Var $errmsg schreiben.
      Alle anderen Aktionen regelst du dann über den Inhalt von $emsg ?
      musste so gehen:
      ...
      if ( $t = ($_put{Titelp} =~ tr/[0-9]//) || ($bt =( $_put{Titelp} =~ tr/[a-zA-Z\W\s\w ]//)) ){
      $emsg.="Title: $Titelp enthält Sonderzeichen!<br>"
      }
      $emsg.="Title wurde nicht ausgefüllt<br>" if $_put{Titelp} eq "";
      
      ....

      Kurz erklärt:
      Die Transliteration ist eine "Sparvariante" von Regex und laut SelfHTML bedeutend schneller, weil die Regex-Maschine von Perl nicht erst initialisiert werden muss. Es wird dabei eine Zuweisung, besser austausch an die zu bearb. Var vom tr/linkenTeilstring// an den tr//rechtenTeilstring/ vorgenommen.
      Wenn man aber nur schreibt $var =~ tr/linkerTeil/rechterTeil/ wird der Inhalt der Variable $var direkt verändert und steht dann nur mit der neuen Wertzuweisung zur Verfügung. Deshalb der Zuweisungs-"Kopier"-Ausdruck
      $varneu = ($var =~ tr/linkerTeil/rechterTeil/), wobei hier das Ergebnis der Transliteration in $varneu steht und $var ihren ursprünglichen Inhalt unverändert beibehält. (ist aber auch auf alle Regulären Ausdrücke übertragbar, wo man nicht den Ursprungsvariableninhalt verändern will).
      
      Der Konstrukt der Translit. von oben macht sich die Eigenart der Transliterationen zunutze, als Rückgabewert die Anzahl der gefundenen Übereinstimmungen zu nutzen (ist ja ne leere Translit, da kein Wert für den Ersetzungsstring auf der rechten Seite des Ausdrucks angegeben wurde). Deshalb erhält man hier immer einen Zahlwert, der dann direkt auswertbar ist.
      Das eröffnet eine gute Möglichkeit, Strings auf Ihre Inhalte zu analysieren, man könnte bspw. nach versch. Zeichen bzw. Zeichengruppen suchen, die Ergebnisse der Anzahl in eine Liste Schreiben und sich für jeden Wert der Liste die Anzahl der Zeichen(gruppen) ausgeben lassen - ein optimaler Weg, um bspw. die Zahl der öffnenden und schließenden Klammern bzw. Geschweiften Klammern in nem Script zu zählen und zu vergleichen (man übergibt den Template-Inhalt einfach an die Funktion, indem man den Inhalt des Templates in ne Var schreibt und am Ende die Funktion ausführt und sich das Ergebnis anzeigen lässt)
      So wäre es auch denkbar, die Ergebnisvariablen direkt mit vorgegebenen Werten zu vergleichen und man hat eine einfache Möglichkeit, Längenbegrenzungen von Eingaben zu machen.
      Bspw 5-Stellige Postleitzahl:
      ....
      $t =  ($var =~ tr/[0-9]//); # Anzahl Zahlzeichen in Var $t speichern
      $bt =($var =~ tr/[a-zA-Z\W\s\w ]//); # Anzahl Nichtzahlzeichen in $bt speichern
      if ($t != 5 || $bt){ #wenn $t nicht gleich 5 ist oder $bt Inhalt hat
      $emsg.= "Die Eingabe entspricht nicht dem üblichen PLZ-Format von 5 Zahlen, bitte wiederholen Sie die Eingabe<br>";
      }
      
      ....
      ohne Zwischenspeichern in Vars komplett in der bedingungszeile würde das so aussehen:
       if ( ($t = ($_ =~ tr/[0-9]//))!= 5  ||  ($bt =( $_ =~ tr/[a-zA-Z\W\s ]//) ) ) {
      $emsg.="Die Eingabe entspricht nicht dem üblichen PLZ-Format von 5 Zahlen";
      }
      

      URL zum Anschaun (beide Varianten): http://baseportal.de/cgi-bin/baseportal.pl?htx=/hempelr/temp/plz_test
      (Gleich noch mit die Laufzeitanzeige beider Varianten in ner for-Schleife, damit es zu auswertbaren Zeiten kommt, man sieht deutlich den Vorteil der zweiten Variante mit der Transliteration und Wertvergleich in der Bedingungszeile)

      Hoffe, nun ist es das, was du brauchst
      Ruben


    Antworten

 Alle Einträge zum Thema: Zur Liste 
    Beitrag von Jürgen (614 Beiträge) am Mittwoch, 13.August.2003, 14:07.
    @Perl-Profis/ regex

      Hi Perl-Freaks,

      hab mal wieder ein Prob.
      Wie kann ich nur Zahlen erlauben?

      So hauts nich hin, da wird alles erlaubt bis auf Zahlen.
      ...
      if($PLZ=~ /[^\w0123456789]/)
      
      ..

      Und umgekehrt ?? Wer hat eine Tipp für mich?
      Danke.

      Gruß
      Jürgen

     Antworten

    Beitrag von Sander (8133 Beiträge) am Mittwoch, 13.August.2003, 14:14.
    Re: @Perl-Profis/ regex

      if($PLZ=~ /^\d+$/) oder if($PLZ=~ /^[0-9]+$/)
      
      umgekehrt (alles außer zahlen):
      if($PLZ=~ /^[^\d]+$/) oder if($PLZ=~ /^[^0-9]+$/)

      Sander

     Antworten

    Beitrag von Jürgen (614 Beiträge) am Mittwoch, 13.August.2003, 22:11.
    Re: @Perl-Profis/ regex

      Hi Sander,

      Danke vorab. Funzt soweit, aber wenn ich das Feld mit 2345gfgf übergebe,
      wird es zugelassen. Es sollten nur Zahlen möglich sein.
      hast du noch eine Tipp für mich ??
      Danke.

      Gruß
      Jürgen

     Antworten

    Beitrag von hempelr (1976 Beiträge) am Donnerstag, 14.August.2003, 07:37.
    Re: @Perl-Profis/ regex

      Hallo, Jürgen,
      mit meinem Regex-Unverstand würde ich es mit ner zweistufigen Transliteration machen, einmal auf Zahlen abfragen und einmal auf Wortzeichen und dann im Vergleich das eine auf Vorhandensein und das andere auf nicht Vorhandensein
      Hier mal der getestete Codeabschnitt (müsste auch die Sonderzeichen erschlagen):
      ################################
      # Zahlentest
      $z1 = "123k5";
      $z2 = "12345";
      $z3 = "1238wert";
      $z4 = "12\5\n rtz";
      $z5 = "123 456";
      $z6 = "a12bcd";
      #
      foreach ($z1,$z2,$z3,$z4,$z5,$z6){
      $t = ($_ =~ tr/[0-9]//); # Anzahl der Ziffernzeichen
      $bt =( $_ =~ tr/[a-zA-Z\W\s\w ]//); # Anzahl der anderen Zeichen
      out "Wert ist: $_ /  - ";
      if ($t  && !$bt ){
      out "Anzahl Zahlzeichen: $t - Anzahl andere Zeichen: $bt - ";
      out " Nur Zahlen <br>";}
      else {
      out "Anzahl Zahlzeichen: $t - Anzahl andere Zeichen: $bt - ";
      out " Zahlen und Buchstaben <br>";}
      }
      ################################
      Kannst natürlich die Wertzuweisungen an $t und $bt gleich in der Abfrage zusammenfassen, wenn du die Werte nicht brauchts:
      if ( $t = ($_ =~ tr/[0-9]//)  && !$bt =( $_ =~ tr/[a-zA-Z\W\s\w ]//) ){
      
      ....
      }
      Hoffe es hilft dir
      Ruben

     Antworten

    Beitrag von hempelr (1976 Beiträge) am Donnerstag, 14.August.2003, 07:40.
    Sorry, "kleiner" Interpunktionsfehler: Re: @Perl-Profis/ regex

      sorry, Klammern vergessen, so richtig in Vergleichsausdruck:
      if ( $t = ($_ =~ tr/[0-9]//) && !($bt =( $_ =~ tr/[a-zA-Z\W\s\w ]//)) ){
      
      ...
      }
      Ruben

     Antworten

    Beitrag von Jürgen (614 Beiträge) am Donnerstag, 14.August.2003, 09:55.
    Re: Sorry, "kleiner" Interpunktionsfehler: Re: @Perl-Profis/ regex

      Hi Ruben,

      danke vorab mal. Muß das ganze erst noch checken. Hoffe brings hin ;-)
      Noch was, wie kann ich den Code vereinfachen??

      $emsg.="Title: $Titelp enthält Sonderzeichen!<br>" if($_put{Titelp}=~ /[^\w .,;:-]/);
      $emsg.="Title wurde nicht ausgefüllt<br>" if $_put{Titelp} eq "";
      

      Kann man das in eine if-Anweisung auch packen ?? Sonderzeichen Ja/Nein und wurd Feld überhaupt Ausgefüllt??

      Danke.

      Gruß
      Jürgen

     Antworten

    Beitrag von hempelr (1976 Beiträge) am Donnerstag, 14.August.2003, 13:09.
    Re: Sorry, "kleiner" Interpunktionsfehler: Re: @Perl-Profis/ regex

      mhm - warte mal, du willst also nur die Eingabe überprüfen und wenn sie falsch ist eine spezielle Fehlermeldung in die Var $errmsg schreiben.
      Alle anderen Aktionen regelst du dann über den Inhalt von $emsg ?
      musste so gehen:
      ...
      if ( $t = ($_put{Titelp} =~ tr/[0-9]//) || ($bt =( $_put{Titelp} =~ tr/[a-zA-Z\W\s\w ]//)) ){
      $emsg.="Title: $Titelp enthält Sonderzeichen!<br>"
      }
      $emsg.="Title wurde nicht ausgefüllt<br>" if $_put{Titelp} eq "";
      
      ....

      Kurz erklärt:
      Die Transliteration ist eine "Sparvariante" von Regex und laut SelfHTML bedeutend schneller, weil die Regex-Maschine von Perl nicht erst initialisiert werden muss. Es wird dabei eine Zuweisung, besser austausch an die zu bearb. Var vom tr/linkenTeilstring// an den tr//rechtenTeilstring/ vorgenommen.
      Wenn man aber nur schreibt $var =~ tr/linkerTeil/rechterTeil/ wird der Inhalt der Variable $var direkt verändert und steht dann nur mit der neuen Wertzuweisung zur Verfügung. Deshalb der Zuweisungs-"Kopier"-Ausdruck
      $varneu = ($var =~ tr/linkerTeil/rechterTeil/), wobei hier das Ergebnis der Transliteration in $varneu steht und $var ihren ursprünglichen Inhalt unverändert beibehält. (ist aber auch auf alle Regulären Ausdrücke übertragbar, wo man nicht den Ursprungsvariableninhalt verändern will).
      
      Der Konstrukt der Translit. von oben macht sich die Eigenart der Transliterationen zunutze, als Rückgabewert die Anzahl der gefundenen Übereinstimmungen zu nutzen (ist ja ne leere Translit, da kein Wert für den Ersetzungsstring auf der rechten Seite des Ausdrucks angegeben wurde). Deshalb erhält man hier immer einen Zahlwert, der dann direkt auswertbar ist.
      Das eröffnet eine gute Möglichkeit, Strings auf Ihre Inhalte zu analysieren, man könnte bspw. nach versch. Zeichen bzw. Zeichengruppen suchen, die Ergebnisse der Anzahl in eine Liste Schreiben und sich für jeden Wert der Liste die Anzahl der Zeichen(gruppen) ausgeben lassen - ein optimaler Weg, um bspw. die Zahl der öffnenden und schließenden Klammern bzw. Geschweiften Klammern in nem Script zu zählen und zu vergleichen (man übergibt den Template-Inhalt einfach an die Funktion, indem man den Inhalt des Templates in ne Var schreibt und am Ende die Funktion ausführt und sich das Ergebnis anzeigen lässt)
      So wäre es auch denkbar, die Ergebnisvariablen direkt mit vorgegebenen Werten zu vergleichen und man hat eine einfache Möglichkeit, Längenbegrenzungen von Eingaben zu machen.
      Bspw 5-Stellige Postleitzahl:
      ....
      $t =  ($var =~ tr/[0-9]//); # Anzahl Zahlzeichen in Var $t speichern
      $bt =($var =~ tr/[a-zA-Z\W\s\w ]//); # Anzahl Nichtzahlzeichen in $bt speichern
      if ($t != 5 || $bt){ #wenn $t nicht gleich 5 ist oder $bt Inhalt hat
      $emsg.= "Die Eingabe entspricht nicht dem üblichen PLZ-Format von 5 Zahlen, bitte wiederholen Sie die Eingabe<br>";
      }
      
      ....
      ohne Zwischenspeichern in Vars komplett in der bedingungszeile würde das so aussehen:
       if ( ($t = ($_ =~ tr/[0-9]//))!= 5  ||  ($bt =( $_ =~ tr/[a-zA-Z\W\s ]//) ) ) {
      $emsg.="Die Eingabe entspricht nicht dem üblichen PLZ-Format von 5 Zahlen";
      }
      

      URL zum Anschaun (beide Varianten): http://baseportal.de/cgi-bin/baseportal.pl?htx=/hempelr/temp/plz_test
      (Gleich noch mit die Laufzeitanzeige beider Varianten in ner for-Schleife, damit es zu auswertbaren Zeiten kommt, man sieht deutlich den Vorteil der zweiten Variante mit der Transliteration und Wertvergleich in der Bedingungszeile)

      Hoffe, nun ist es das, was du brauchst
      Ruben

     Antworten


     
 Liste der Einträge von 35700 bis 35850:Einklappen Zur Eingabe 
Neueste Einträge << 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | Neuere Einträge < Zur Eingabe  > Ältere Einträge | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 >> Älteste Einträge


Zurück zur Homepage

© baseportal.de. Alle Rechte vorbehalten. Nutzungsbedingungen



powered in 0.07s by baseportal.de
Erstellen Sie Ihre eigene Web-Datenbank - kostenlos!