Nur bestimmte Zeichen im String erlauben

  • Hallo!

    Ich möchte bei einem String ($string) nur zuvor definierte Zeichen aus einem Array erlauben (siehe unten: $allowed). Sollte ein Zeichen in dem String vorkommen, das nicht im Array steht, soll es ausgeschnitten werden.

    Folgenden Code habe ich mir gebastelt:

    [autoit]

    $string = "Test: abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ ()-_[]{};:'@#~,<.>/?\| 1234567890 Ende"

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

    msgbox(0, "", $string)

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

    Global $allowed[63] = [ _
    '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', ' ', _
    'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', _
    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']

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

    For $i = 0 To StringLen($string)-1
    For $i = 0 To UBound($allowed)-1
    If Not StringInStr($string, $allowed[$i], 1, 0, 0) Then $string = StringReplace($string, $allowed[$i], '', 0, 1)
    Next
    Next

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

    msgbox(0, "", $string)

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

    Exit

    [/autoit]

    Leider passiert nach der ersten MsgBox nichts. Woran könnte das liegen?

    PS: Sollte ich vielleicht eher StringRegExpReplace() benutzen?

    Danke

    EDIT:
    Ich habe die Schleifen geändert in:

    [autoit]

    For $i = 0 To StringLen($string)-1
    For $j = 0 To UBound($allowed)-1
    If Not StringInStr($string, $allowed[$j], 1, 0, 0) Then $string = StringReplace($string, $allowed[$j], '', 0, 1)
    Next
    Next

    [/autoit]


    Jetzt wird zwar ausgeschnitten, aber leider nur Zeichen, die im Array sind. Wenn ich das "Not" in der If-Abfrage weglasse, wird alls ausgeschnitten... ich bin verwirrt!

    EDIT2:
    Gelöst! Siehe https://autoit.de/index.php?page…9013#post249013

    Einmal editiert, zuletzt von pete_gzome (7. März 2012 um 19:57)

    • Offizieller Beitrag

    Du hast 2 For Next Schleifen mit der Variable $i, das kann nicht gehen.

    Spoiler anzeigen
    [autoit]

    #Region - Timestamp
    ; 2012-03-07 19:44:10
    #EndRegion

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

    $string = "Test: abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ ()-_[]{};:'@#~,<.>/?\| 1234567890 Ende"

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

    msgbox(0, "", $string)

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

    Global $allowed[63] = [ _
    '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', ' ', _
    'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', _
    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']

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

    For $i = 0 To StringLen($string)-1

    For $j = 0 To UBound($allowed)-1
    If Not StringInStr($string, $allowed[$j], 1, 0, 0) Then $string = StringReplace($string, $allowed[$j], '', 0, 1)
    Next
    Next

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

    msgbox(0, "", $string)

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

    Exit

    [/autoit]
  • Wenn du das so machen willst, wie in deinem Edit, müsstest du ein Array mit verbotenen Zeichen haben.
    Ich würde es eher mit StringRegExpReplace machen, mit einem Pattern wie dem folgenden:

    Code
    [^A-Za-z0-9 ]

    edit: Leerzeichen vergessen (thx K4z)

    Twitter: @L3viathan2142
    Benutze AutoIt persönlich nicht mehr, da ich keinen Windows-Rechner mehr besitze.

    Einmal editiert, zuletzt von L3viathan (7. März 2012 um 19:54)

  • Raupi Jop, habe ich kurz nach dem Posten auch gemerkt :P

    Es will trotzdem nicht, siehe Edit oben.

    Woran könnte das liegen?

    @leviathan
    Okay. Da fehlt dann nur noch das erlaubte Leerzeichen in der RegEx. Ich werde es mal probieren

  • [autoit]

    $string = "Test: abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ ()-_[]{};:'@#~,<.>/?\| 1234567890 Ende"
    msgbox(0, "", $string)
    $string = StringRegExpReplace($string, "[^A-Za-z0-9 ]", "")
    msgbox(0, "", $string)

    [/autoit]


    Das funktioniert perfekt. Dankeschön!