Da Pinky: preg_replace: sonderzeichen entfernen

hallo,

ich möchte meinen besuchern die möglichkeit geben ihre dateien umzubenennen. wie genau filter ich die sonderzeichen raus, die nicht in einem dateinamen vorkommen dürfen? alle fragwürdigen zeichen sollen rausgeworfen werden, leerzeichen mit einem _ ersetzt werden.
ich habs so (nach wikipedia, "Regular expression") versucht, klappt aber irgendwie nicht:

$filename = preg_replace('[:punct:]', "", $filename);
$filename = preg_replace('[:blank:]',"_",$filename);
$filename = preg_replace('[:space:]', "_",$filename);

vielen dank für eure mühen!

  1. Hallo,

    $filename = preg_replace('[:punct:]', "", $filename);
    $filename = preg_replace('[:blank:]',"_",$filename);
    $filename = preg_replace('[:space:]', "_",$filename);

    Die POSIX-Zeichenklassen funktionieren bei den PERL-kompatiblen regulären Ausdrücken nicht.

    Siehe: http://de3.php.net/manual/de/reference.pcre.pattern.syntax.php

    Alle Leerzeichen bekommst Du bspw. mit \s (statt [:space:]).

    Viele Grüße,
    Christian

    1. 你好 Christian,

      $filename = preg_replace('[:punct:]', "", $filename);
      $filename = preg_replace('[:blank:]',"_",$filename);
      $filename = preg_replace('[:space:]', "_",$filename);

      Die POSIX-Zeichenklassen funktionieren bei den PERL-kompatiblen
      regulären Ausdrücken nicht.

      Ich muss dich enttäuschen. Wenn man sie richtig anwendet gibt es sie auch
      bei PCRE:

      $filename = preg_replace('[[:punct:]]','',$filename);

      Das muss man übrigens auch bei POSIX Regexen so machen... die Syntax oben
      ist in jedem Fall inkorrekt.

      再见,
       克里斯蒂安

      --
      Plasma-Bildschirm geklaut | Zahnarztbesuch
      Fatal! Ich kann kein Reserve-Offizier mehr sein!
      http://wwwtech.de/
      1. Hallo 克里斯蒂安,

        Ich muss dich enttäuschen. Wenn man sie richtig anwendet gibt es sie auch
        bei PCRE:

        $filename = preg_replace('[[:punct:]]','',$filename);

        Oh, wußte ich gar nicht (steht auch glaube ich nicht in der PHP-Doku, stand zumindest nicht da, als ich sie gelesen habe).

        Aber bei Deinem Beispiel fehlen trotzdem noch die Delimiter. ;-)

        $filename = preg_replace('/[[:punct:]]/','',$filename);

        Viele Grüße,
        Christian

        1. 你好 Christian,

          Hallo 克里斯蒂安,

          Hehe ;)

          Aber bei Deinem Beispiel fehlen trotzdem noch die Delimiter. ;-)

          $filename = preg_replace('/[[:punct:]]/','',$filename);

          Äh. Ja. Danke ;)

          再见,
           克里斯蒂安

          --
          Plasma-Bildschirm geklaut | Zahnarztbesuch
          Das Sein entsteht aus dem Nicht-Sein.
          http://wwwtech.de/
      2. $filename = preg_replace('[[:punct:]]','',$filename);

        Das muss man übrigens auch bei POSIX Regexen so machen... die Syntax oben
        ist in jedem Fall inkorrekt.

        danke für deine hilfe, ich habs so ausprobiert - klappt aber auch nicht:
        Warning: preg_replace() [function.preg-replace]: Compilation failed: POSIX named classes are supported only within a class at offset 0

        hab in meinem experimentierdrang mal preg_replace in ereg_replace geändert, dann hats geklappt :)

        danke nochmal, problem gelöst.

        1. Hallo,

          danke für deine hilfe, ich habs so ausprobiert - klappt aber auch nicht:
          Warning: preg_replace() [function.preg-replace]: Compilation failed: POSIX named classes are supported only within a class at offset 0

          Das liegt an den fehlenden Delimitern, siehe meine Antwort an Christian.

          hab in meinem experimentierdrang mal preg_replace in ereg_replace geändert, dann hats geklappt :)

          preg_replace ist ereg_replace aber vorzuziehen, da schneller und binärsicher (und kann mehr, was hier aber irrelevant ist).

          Viele Grüße,
          Christian