Maik W. aus E.: REGEX mit "ohne"

Tach zusammen,

ich habe mir für mein kleines PHP-Dateiverwaltungssystem eine Regex gebaut, die abprüft, ob Leer- oder Sonderzeichenin einem String vorhanden sind.
Mit if(preg_match("=ä|ü|ö|ß|[[:punct:]]|[[:space:]]=i", $projekt_ordnername))
klappt das für meine erste Expression schon sehr gut. Allerdings werden auch Unterstriche(_) als Treffer ausgegeben; gibt es eine Möglichkeit, eine Regex mit "ohne _" zu formulieren?

Danke für jeden Tip..

Grüße aus Essen

Maik

  1. hi!

    ich habe mir für mein kleines PHP-Dateiverwaltungssystem eine Regex gebaut, die abprüft, ob Leer- oder Sonderzeichenin einem String vorhanden sind.
    Mit if(preg_match("=ä|ü|ö|ß|[[:punct:]]|[[:space:]]=i", $projekt_ordnername))
    klappt das für meine erste Expression schon sehr gut. Allerdings werden auch Unterstriche(_) als Treffer ausgegeben; gibt es eine Möglichkeit, eine Regex mit "ohne _" zu formulieren?

    if(preg_match("/[äÄüÜöÖß\s]/i", $projekt_ordnername))

    überprüft ob Du Umaute, ß, leerzeichen, tabs, umrüche(\s) in dem String hast. Übrigens funktioniert Groß-Kleinschreibung bei Umlauten nur wenn Du DE als Standardsprache in der php.ini angegeben hast! Vielleicht brauchst Du noch /[äÄüÜöÖß\s.,?!&%$§()/\='´`]/ aber vielleicht geht das auch noch kürzer, kommt halt drauf an was Du alles machen möchtest!

    Grüße
    Andreas

    1. Holla

      if(preg_match("/[äÄüÜöÖß\s]/i", $projekt_ordnername))

      Doppelt gemoppelt hält doppelt so gut ;)
      Wenn Du den Modifier /i hinten dran hängst brauchst Du in der Klammer nicht mehr die zugehörigen Großbuchstaben schreiben:

      /[äöüß\s]/i tut's auch.

      http://www.php.net/manual/de/pcre.pattern.modifiers.php

      Ciao,

      Harry
       (der echte)

      1. Hallo Harry,

        Wenn Du den Modifier /i hinten dran hängst brauchst Du in der
        Klammer nicht mehr die zugehörigen Großbuchstaben schreiben:

        Die Erklaerung hat er doch dazu geschrieben: die automatische Erkennung
        der grossen Varianten der Umlaute funktioniert nur mit den korrekten
        LOCALE-Einstellungen :) Auch in Perl.

        Das liegt daran, dass es in usascii keine Umlaute gibt. Wenn du dich
        daran erinnerst: ASCII ist nur bis 128 definiert, alles danach ist fuer
        laenderspezifische Erweiterungen.

        (der echte)

        Gruesse,
         CK, auch der echte

        1. n'Abend ...

          Die Erklaerung hat er doch dazu geschrieben: die automatische Erkennung
          der grossen Varianten der Umlaute funktioniert nur mit den korrekten
          LOCALE-Einstellungen :) Auch in Perl.

          Ich bin blind ...
          Oder zumindest sowas ähnliches.

          Das liegt daran, dass es in usascii keine Umlaute gibt. Wenn du dich
          daran erinnerst: ASCII ist nur bis 128 definiert, alles danach ist fuer
          laenderspezifische Erweiterungen.

          Naja, als ich mit Basic am Schneider-PC angefangen hab hab ich mir über "Internationalität" noch keine Gedanken gemacht, wobei ich aber keinen Plan habe, was der Rechner für eine Zeichentabelle verwendet hat.
          Und meine Q-Basic Programme unter DOS ... das waren alles deutsch Textadventures oder kleine Primitiv-2D-Ballerspiele ... auch kein Fall für's internationale.

          Aber jetzt wo Du's sagst, ja, da war doch was ... ;)

          Ciao,

          Harry
           (usw.)

    2. Hallo,

      überprüft ob Du Umaute, ß, leerzeichen, tabs, umrüche(\s)

      Umbrueche sind mit '\s' nicht abgedeckt. Da muss schon der s-Modifier
      mit her:

      preg_match("/[äüöß\s]/si", $projekt_ordnername)

      Übrigens funktioniert Groß-Kleinschreibung bei Umlauten nur wenn Du
      DE als Standardsprache in der php.ini angegeben hast!

      Falsch: wenn die aktuellen Spracheinstellungen von LC_CTYPE und
      LC_COLLATE auf deutsch eingestellt sind. Das kann man entweder ueber
      die php.ini machen oder ueber setlocale (http://www.php.net/manual/de/function.setlocale.php).

      Gruesse,
       CK

      1. Hallo!

        überprüft ob Du Umaute, ß, leerzeichen, tabs, umrüche(\s)

        Umbrueche sind mit '\s' nicht abgedeckt. Da muss schon der s-Modifier
        mit her:

        preg_match("/[äüöß\s]/si", $projekt_ordnername)

        Ups, das wußte ich nicht!

        Übrigens funktioniert Groß-Kleinschreibung bei Umlauten nur wenn Du
        DE als Standardsprache in der php.ini angegeben hast!

        Falsch: wenn die aktuellen Spracheinstellungen von LC_CTYPE und
        LC_COLLATE auf deutsch eingestellt sind. Das kann man entweder ueber
        die php.ini machen oder ueber setlocale (http://www.php.net/manual/de/function.setlocale.php).

        Ok ;-)

        Grüße
        Andreas

  2. Hi,

    wes liegt gegen /\w/ vor? Oder habe ich die aufgabenstellung falsch
    verstanden?

    bye eddie

    1. Hi!

      wes liegt gegen /\w/ vor? Oder habe ich die aufgabenstellung falsch
      verstanden?

      Zum einen ist das abhängig von der Spracheinstellung, Außerdem würdest Du damit entweder alle Buchstaben oder alle Buchstaben außer Umlaute und ß. Vielleicht hätte bei Standardeinstellung \W Sinn, so hätte man _alles_ abgedeckt, was keine "gültigen" Buchstaben sind, wäre vielleicht wirklich gschickter das ganze positiv zu definieren, also /[\W_-]/ wäre eigentlich nicht schlecht, jedenfalls sehr viel besser/sicherer/genauer als der Quatsch aus meinem ersten posting ;-)
      Grüße
      Andreas

  3. Hallo Euch allen,
    es ist immer wieder spannend, eine Fachsimpelei losgetreten zu haben, ich bin auch fleißig dabei, Eure Vorschläge nachzuvollziehen, genau das, was ich suchte war nicht dabei, das beantwortet aber auch meine Frage, es gibt wie es scheint doch keine Formulierung für "ohne"...

    Besten Dank

    1. Hallo!

      es ist immer wieder spannend, eine Fachsimpelei losgetreten zu haben, ich bin auch fleißig dabei, Eure Vorschläge nachzuvollziehen, genau das, was ich suchte war nicht dabei, das beantwortet aber auch meine Frage, es gibt wie es scheint doch keine Formulierung für "ohne"...

      Ich muß gestehen genau den teil habe ich nicht verstanden und hatte gehofft das sich das mit dem regulären ausdruck löst.

      Was meinst Du genau - "ohne" - was denn, und ohne was?

      Willst Du jetzt das _ in dem String gefunden wird oder nicht? Ich verstehe nicht was Du besonderes mit "ohne" auszudrücken versuchst.

      Wenn Du innerhalb der regex willst das Ausdrücke ohne "_" gefunden werden, geht das mit [^_]

      Aber erkläre mal den Sinn, was Du genau machen willst, dann kann man Dir bestimmt helfen!

      Grüße
      Andreas

      1. Hallo Andreas

        Ich muß gestehen genau den teil habe ich nicht verstanden und hatte gehofft das sich das mit dem regulären ausdruck löst.

        Was meinst Du genau - "ohne" - was denn, und ohne was?

        Willst Du jetzt das _ in dem String gefunden wird oder nicht? Ich verstehe nicht was Du besonderes mit "ohne" auszudrücken versuchst.

        Ich will die Eingaben von Datei- und Verzeichnisnamen der User überprüfen und bei allen Umlauten, Sonder- und Leerzeichen _außer_ dem "_" eine Fehlermeldung ausgeworfen kriegen...

        Meine ursprüngliche Version mit
         if(preg_match("=ä|ü|ö|ß|[[:punct:]]|[[:space:]]=i", $projekt_ordnername)){
                   $HinweisSonderzeichen = 1;
                  }else{//wenn keine Sonderzeichen drin sind

        erfüllt das ganz ausgezeichnet bis auf den Nachteil, daß auch "_" angemeckert wird, obwohl ich das explizit zulassen will.

        Aber erkläre mal den Sinn, was Du genau machen willst, dann kann man Dir bestimmt helfen!

        Ich hoffe, mein Problem ist klarer geworden,

        Danke für die Geduld

        Gruß aus Essen

        Maik

        1. Hallo!

          Ich will die Eingaben von Datei- und Verzeichnisnamen der User überprüfen und bei allen Umlauten, Sonder- und Leerzeichen _außer_ dem "_" eine Fehlermeldung ausgeworfen kriegen...

          Es wäre das beste Du definierst anders herum alle Zeichen die erlaubt sein sollen. \w heißt Worte, steht für die Zeichenklasse [a-zA-Z0-9_] also, \W heißt genau das Gegenteil, alles außer \w. Da bei Standardeinstellungen die CK genannt hat ;-) äöüÄÖÜß nicht zu \w gehören, hast Du mit \W alle Zeichen außer gültigen Buschstaben, Zahlen, und Unterstrichen. Jetzt mußt Du nur noch definieren, welche Zeichen Du zusätzlich erlauben willst, also wenn Du komplette Dateinamen haben willst brauchst Du auch ".", wenn Du komplette Pfade willst, auch "/" oder "", je nach Betriebssystem. Sonst sollte in den Namen nur "-" vorkommen dürfen. Wenn Du jetzt eine Fehlermeldung ausgeben willst, wenn der String andere Zeichen als \w und einige andere bestimmte Zeichen enthält, würde ich das mit einer Zeichenklasse [ ] machen. Mit ^ kannst Du die Bedeutung aller Zeichen in der zeichenklasse umkehren, also [\W] = [^\w]

          eine lösung sähe so aus:

          preg_match("/[^\w-]/i",$projekt_ordnername)

          damit gibt preg_match einen Wert zurück, wenn ein Zeichen außer a-z, A-Z, 0-9, _ und - vorkommt. Denke daran das - am Ende der Zeichenklasse stehen muß, da es sonst eine andere Bedeutung hat. Wenn Du jetzt noch "." erlauben willst mußt Du die Zeichenklasse so abändern:

          [^\w.-]

          Du könntest z.B. Auch kontrollieren ob es eine gültiger Datename ist:

          [\w-]+.\w{1,4}

          hier wird ein Wert zurückgegeben wenn  es ein "typischer" Dateiname ist(das Gegenteil von vorher!)

          Wenn Du Verzeichnisse und Dateien prüfst würde ich das ungefähr so machen:

          [\w-]+.?\w{0,4}?

          Geht bestimmt auch besser, naja, hoffe es hilft! Wie gesagt, wird im Gegesatz zum 1. Beispiel beim 2. und 3. bei einer korrekten Datei/Verzeichnis ein Wert zurückgegeben, nicht bei einem Fehler!

          Grüße
          Andreas

          Grüße
          Andreas

          1. Hallo!

            Hallo Andreas,

            Ich will die Eingaben von Datei- und Verzeichnisnamen der User überprüfen und bei allen Umlauten, Sonder- und Leerzeichen _außer_ dem "_" eine Fehlermeldung ausgeworfen kriegen...

            eine lösung sähe so aus:

            preg_match("/[^\w-]/i",$projekt_ordnername)

            Genau das ist die Lösung auf meine Antwort!
            Besten Dank

            Wenn Sie nicht sowieso ins Archiv käme, würde ich ihr drei Archiv-Sterne geben!

            Die Datei/Punkt-Problematik habe ich anders gelöst, ich erzwinge eine Dateieingabe mit Endung bzw Punkt und löse dann wiederum am Punkt die Endung vom Dateinamen...

            Geht bestimmt auch besser, naja, hoffe es hilft!

            Keine Ahnung ob es auch besser geht, helfen tut es auf jeden Fall!

            Danke nochmal

            Gruß aus Essen

            Maik

            1. Hi!

              Beachte nur das das solange funktioniert, wie die Lokal-Variablen nicht auf deutsch (de_DE) stehen, wenn das der Fall ist mußt Du das manuell ändern mit http://www.php.net/manual/de/function.setlocale.php, aber frag mich jetzt nicht auf welchen Wert, wenn ich nicht irre auf C.

              Grüße
              Andreas