Eingabe Dateiname prüfen

  • Hallo!

    Eigentlich ist das Problem schon gelöst, da man es einfach anders machen kann. Dennoch interessiert mich die urspüngliche Frage und ich bin neugierig ob es eine Lösung gibt.

    Das Script fragt verschiedene Parameter ab, die verarbeitet werden. Unter anderem soll der Benutzer einen Speicherpfad via "FileSelectFolder" wählen und in einer "InputBox" den Namen angeben unter dem gespeichert werden soll.

    Problem: Den Zeichenraum eingrenzen um verbotene Zeichen im Dateinamen auszuschließen also z.B. /+'"\ usw.
    schwache Lösung: If StringIsAlNum -> ok , sonst wird die Eingabe nicht angenommen und der vorige Standardwert bleibt erhalten.

    warum schwach: weil damit auch keine Dateinamen mit "_" oder "-" möglich sind.

    Workaround: Pfad und Dateiname mit "FileSaveDialog" abfragen und die Elemente z.B. per "_PathSplit" extrahieren. Das gute daran, es löst auch gleich das Problem, dass per "FileSelectFolder" auch sinnfreie Ergebnisse wie "Computer" möglich sind wenn das root dir nicht sehr eng begrenzt wird, was weitere Fehlerbehandlung nötig macht.

    Nun meine Frage: Wie kann ich eine beliebige Eingabe möglichst kurz und knackig auf gültige Zeichen z.B. für Dateinamen prüfen, um dem Nutzer zu sagen dass Zeichen x ungültig ist und es neu versucht werden soll. Also etwas in der Art 'StringIsAlNum or "_" or "-"' Ohne gleich eine 2-Seitige RegEx schreiben zu müssen, da bin ich nämlich schlecht drin. Gibt es eine UDF?
    AFAIK gibt es in php fertige Funktionen um Eingaben zu maskieren und den gefährlichen Zeichensatz zu Filtern.

    Vielen Dank für´s lesen und noch mehr Dank für Antworten.

    Einmal editiert, zuletzt von Hakeem (31. August 2014 um 05:41) aus folgendem Grund: James brachte die Antwort.

  • Danke schonmal.
    Puh, das ist echt nicht meine normale Baustelle.

    Wenn ich das jetzt richtig nachgeschlagen habe prüft deine RegExp den String auf alle Zeichen die im Set ([ ]) enthalten sind und meldet mit 1 oder 0 das Ergebnis. Wobei 0 wohl bedeutet es gibt weitere Zeichen?!

    Das Set besteht aus
    "\w" = a-z, A-Z ,0-9 oder Unterstrich (_)
    und "-"

    Und dank "+" läuft es mindestens einmal durch und zwar von Zeilenbeginn "^" bis zum Zeilenende "$".

    Habe ich das korrekt verstanden oder kannst du das noch ergänzen bzw. korrigieren. Ich frage mich auch ob man bei einem einfachen String "^" und "$" braucht.

    Grüße!

  • Das stimmt soweit.

    Ohne ^ und $ würde es bedeuten, dass irgendwo im String diese Zeichen vorkommen; es aber auch noch jeden möglichen anderen Mist im String geben kann. D.h. 1 als Ergebnis würde bedeuten, dass der String zwar A-Z, a-z, 0-9, _ und/oder - enthält, aber eben nicht ausschließlich.

  • Hi,
    obwohl RegEx sich für solche "Kleinigkeiten" natürlich sehr gut eignet, kann man das Problem natürlich auch mit den einfachen Stringfunktionen lösen.

    Spoiler anzeigen
    [autoit]

    $erlaubte_zeichen = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_- 1234567890" & "ÄÖÜäöüß"

    [/autoit] [autoit][/autoit] [autoit]

    $teststring = "Blablub12345"
    $test = String_enthaelt_erlaubte_Zeichen($teststring, $erlaubte_zeichen)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $test = ' & $test & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console

    [/autoit] [autoit][/autoit] [autoit]

    $teststring = "Blablub12345"
    $test = String_enthaelt_erlaubte_Zeichen($teststring, $erlaubte_zeichen)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $test = ' & $test & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console

    [/autoit] [autoit][/autoit] [autoit]

    $teststring = -44
    $test = String_enthaelt_erlaubte_Zeichen($teststring, $erlaubte_zeichen)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $test = ' & $test & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func String_enthaelt_erlaubte_Zeichen($string, $erlaubt = "1234567890") ;return 1, wenn alle Zeichen im String erlaubt sind
    If $string = "" or $erlaubt="" Then Return 0
    For $i = 1 To StringLen($string)
    If StringInStr($erlaubt, StringMid($string, $i, 1), 1) = 0 Then Return 0 ;nicht erlaubtes Zeichen gefunden
    Next
    Return 1 ;$string enthält nur erlaubte Zeichen
    EndFunc ;==>String_enthaelt_erlaubte_Zeichen

    [/autoit]


    Das hat für mich den Vorteil, die Funktion debuggen zu können, was bei RegExen nicht möglich ist. Dort muss man auf seine Fähigkeiten vertrauen und HOFFEN, dass man das Pattern für alle Fälle richtig erstellt hat.
    Die einschlägigen Internetforen sind voll von Anfragen, wieso das Pattern NICHT alle oder (viel schlimmer) falsche Treffer liefert. Somit ist man darauf angewiesen, auf die Fähigkeiten von anderen ( ! ) zu vertrauen. Ob das jemanden weiterbringt, der für seine Arbeit verantwortlich gemacht wird, sei man dahingestellt...

    Zitat

    so langsam lichtet sich das Dunkel von regulären Ausdrücken. Es scheint bereits ne Kerze im Nebel

    Bei mir scheint diese Kerze seit Jahrzehnten...bringt nur nix, wenn man für relativ einfache Aufgaben vorher stundenlang den Nebel wegwedeln muss. Und dazu noch mit dem Hintergrund, dass es auf unterschiedlichen Systemen/Programmiersprachen mit identischem Pattern völlig verschiedene Ergebnisse geben kann.

    • Offizieller Beitrag

    Um das RegExp-Pattern einfach zu halten, könnte man alle erlaubten Zeichen aus dem String löschen und danach auf einen Leerstring testen:

    Spoiler anzeigen
    [autoit]


    $erlaubte_zeichen = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_ 1234567890" & "ÄÖÜäöüß\-\."

    [/autoit] [autoit][/autoit] [autoit]

    $teststring = "Blablub12345.txt"
    $test = String_enthaelt_erlaubte_Zeichen($teststring, $erlaubte_zeichen)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $test = ' & $test & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console

    [/autoit] [autoit][/autoit] [autoit]

    $teststring = "Blablub12345.jpg"
    $test = String_enthaelt_erlaubte_Zeichen($teststring, $erlaubte_zeichen)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $test = ' & $test & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console

    [/autoit] [autoit][/autoit] [autoit]

    $teststring = 'test*.exe'
    $test = String_enthaelt_erlaubte_Zeichen($teststring, $erlaubte_zeichen)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $test = ' & $test & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console

    [/autoit] [autoit][/autoit] [autoit]

    Func String_enthaelt_erlaubte_Zeichen($string, $erlaubt = "1234567890") ;return 1, wenn alle Zeichen im String erlaubt sind
    If $string = "" Or $erlaubt = "" Then Return False
    Return StringRegExpReplace($string, "[" & $erlaubt & "]", "") = ""
    EndFunc ;==>String_enthaelt_erlaubte_Zeichen

    [/autoit]
  • Spoiler anzeigen
    [autoit]

    $erlaubte_zeichen = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_- 1234567890" & "ÄÖÜäöüß"

    [/autoit] [autoit][/autoit] [autoit]

    $teststring = "Blablub12345"
    $test = String_enthaelt_erlaubte_Zeichen($teststring, $erlaubte_zeichen)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $test = ' & $test & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console

    [/autoit] [autoit][/autoit] [autoit]

    $teststring = "Blablub12345"
    $test = String_enthaelt_erlaubte_Zeichen($teststring, $erlaubte_zeichen)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $test = ' & $test & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console

    [/autoit] [autoit][/autoit] [autoit]

    $teststring = -44
    $test = String_enthaelt_erlaubte_Zeichen($teststring, $erlaubte_zeichen)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $test = ' & $test & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func String_enthaelt_erlaubte_Zeichen($string, $erlaubt = "1234567890") ;return 1, wenn alle Zeichen im String erlaubt sind
    If $string = "" Or $erlaubt = "" Then Return 0
    For $i = 1 To StringLen($erlaubt)
    $string = StringReplace($string, StringMid($erlaubt, $i, 1), "") ;alle erlaubten Zeichen aus dem String löschen
    Next
    If $string = "" Then Return 1
    Return 0 ;$string enthält nur erlaubte Zeichen
    EndFunc ;==>String_enthaelt_erlaubte_Zeichen

    [/autoit]

    macht das RegEx-Pattern dank Oskars Idee komplett überflüssig :D