romy: regular Expression

Hi,

ich habe mich daran versucht eine Überprüfungsfunktion zu schreiben, welche nur  Ziffern, Buchstaben, Punkt und Unterstrich zulässt, leider ist es nicht geglückt. Wenn ich Semikolons oder Leerzeichen im String habe wird er trotzdem zurückgegeben und nicht leer gemacht.
Kann mir bitte jemand unter die Arme greifen.

<code>
function checkString($string) {
 $pattern = "([a-z]|[A-Z]|[0-9]|._)*";
 if(!eregi($pattern, $string)) $string="";
 return $string;
}
</code>

ciao
romy--
DIE ROMY AUS L. AN DER P. SAGT DANKE UND AUF WIEDERSEHEN

->Alles ist gut wenn es aus Schokolade ist

  1. Hi,

    $pattern = "([a-z]|[A-Z]|[0-9]|._)*";

    Du prüfst hier auf _beliebig viele_ Vorkommen (auch keines) von eine Klein-, einem Großbuchstaben, einer Ziffer oder der Zeichenfolge "._". Beschäftige Dich damit,

    • was eine Zeichenklasse ist (also die eckigen Klammern),
    • wie man Zeilenende und -anfang findet, und
    • was der Unterschied zwischen "*" und "+" ist.

    Cheatah

    --
    X-Will-Answer-Email: No
    1. Hi,

      $pattern = "([a-z]|[A-Z]|[0-9]|._)*";
      "._". Beschäftige Dich damit,

      hier hatte ich was vergessen
      .|_

      • was eine Zeichenklasse ist (also die eckigen Klammern),

      ist eine Auswahl von Zeichen, habe auch den negationsoperator gefunden

      • wie man Zeilenende und -anfang findet, und

      brauche ich dass? Es ist jedenfalls ^ für Anfang $ für Ende

      • was der Unterschied zwischen "*" und "+" ist.

      okay hab ich jetzt auch, * mehr oder kein Zeichen

      • eins oder mehr

      jetzt sieht es so aus:
      ([a-z]|[A-Z]|[0-9]|.|_)+

      aber es klappt immer noch nicht!

      ciao
      romy

      --
      DIE ROMY AUS L. AN DER P. SAGT DANKE UND AUF WIEDERSEHEN
      ->Alles ist gut wenn es aus Schokolade ist
      1. Hi,

        • was eine Zeichenklasse ist (also die eckigen Klammern),
          ist eine Auswahl von Zeichen, habe auch den negationsoperator gefunden

        ja, und sie verhindert, dass Du einzelne Zeichen durch viele "|" trennen musst. Teilweise setzt Du schon Zeichenklassen ein, aber das kannst Du noch viel schöner machen.

        Übrigens ist \w eine Zeichenklasse, die Groß-, Kleinbuchstaben, Ziffern und den Unterstrich enthält. Das aber nur nebenbei.

        • wie man Zeilenende und -anfang findet, und
          brauche ich dass?

        Egg logical. Du willst ja schließlich den String von Anfang bis Ende betrachten, nicht einfach nur irgendwo mittendrin.

        jetzt sieht es so aus:
        ([a-z]|[A-Z]|[0-9]|.|_)+
        aber es klappt immer noch nicht!

        Stimmt :-) Mich würde jetzt noch interessieren, _welche_ Fehlermeldung Du erhälst.

        Cheatah

        --
        X-Will-Answer-Email: No
        1. Hi,

          Stimmt :-) Mich würde jetzt noch interessieren, _welche_ Fehlermeldung Du erhälst.

          keinen Fehler, er lässt nur strings zu, die er nicht soll:

          probiere es jetzt so, aber es will nicht:
          "^([\w])+$"

          da sagt er no ending delimiter "^" found, warum?
          sorry, wenn  es so lange dauert, aber ich wüsste nicht wie ich es sonst rauskriegen sollte!

          ciao
          romy

          --
          DIE ROMY AUS L. AN DER P. SAGT DANKE UND AUF WIEDERSEHEN
          ->Alles ist gut wenn es aus Schokolade ist
          1. Hi,

            also dies hier habe ich aus einem Buch und es geht nicht:

            $pattern = "[1]+(.[_a-zA-Z0-9])*$";

            immer kommt no ending delimiter ^ found! Warum?

            danke
            ciao
            romy

            --
            DIE ROMY AUS L. AN DER P. SAGT DANKE UND AUF WIEDERSEHEN
            ->Alles ist gut wenn es aus Schokolade ist

            1. _a-zA-Z0-9 ↩︎

            1. Huhu romy

              $pattern = "[1]+(.[_a-zA-Z0-9])*$";
              immer kommt no ending delimiter ^ found! Warum?

              ich vermute mal, das Du inzwischen von ereg auf preg_match umgestiegen bist.
              Dann musst Du Deinen regulären Ausdruck in Delimiter einschliessen.

              <quote>

              The syntax for patterns used in these functions closely resembles Perl. The expression should be enclosed in the delimiters, a forward slash (/), for example. Any character can be used for delimiter as long as it's not alphanumeric or backslash (). If the delimiter character has to be used in the expression itself, it needs to be escaped by backslash. Since PHP 4.0.4, you can also use Perl-style (), {}, [], and <> matching delimiters.
              </quote>

              http://www.php.net/manual/en/ref.pcre.php

              Üblicherweise wird / als Delimiter benutzt, es können aber auch andere Zeichen verwendet werden (s.o.).

              Ändere also mal Dein Pattern in
              $pattern = "/[2]+(.[_a-zA-Z0-9])*$/";

              Viele Grüße

              lulu

              --
              bythewaythewebsuxgoofflineandenjoytheday

              1. _a-zA-Z0-9 ↩︎

              2. _a-zA-Z0-9 ↩︎

  2. Hallo romy,

    Kann mir bitte jemand unter die Arme greifen.

    Prüfe, ob der String _ausschließlich_ aus diesen Zeichen besteht und sie nich nur entählt. (Stichworte: ^ und $) Ach ja, preg_match ist sinnvoller als eregi.

    Christian

    --
    Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
    1. Hi,

      Prüfe, ob der String _ausschließlich_ aus diesen Zeichen besteht und sie nich nur entählt. (Stichworte: ^ und $)

      Ich weiss dass dies die Zeichen sind, die Anfang und Ende einleiten. Aber wo sollen sie genau hin

      ^([a-z]|[A-Z]|[0-9]|.|_)+$ //Fehlermeldung
      ^([a-z]|[A-Z]|[0-9]|.|_)$+ //Fehlermeldung

      Ehrlich gesagt finde ich kein Beispiel, wo das + noch hintendran ist.
      Kannst Du mir bitte noch einen Schubs geben.

      @ Chetah, okay ich brauche sie ;)

      ciao
      romy

      --
      DIE ROMY AUS L. AN DER P. SAGT DANKE UND AUF WIEDERSEHEN
      ->Alles ist gut wenn es aus Schokolade ist
      1. Hallo romy,

        ^([a-z]|[A-Z]|[0-9]|.|_)+$ //Fehlermeldung

        Bei mir funktioniert dieser Ausdruck, sowohl mit eregi als auch mit preg_match.

        Christian

        --
        Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
        1. Hi,

          ^([a-z]|[A-Z]|[0-9]|.|_)+$ //Fehlermeldung

          Bei mir funktioniert dieser Ausdruck, sowohl mit eregi als auch mit preg_match.

          Es kommt bei mir der Fehler No ending delimiter '^' found ???

          ciao
          romy

          --
          DIE ROMY AUS L. AN DER P. SAGT DANKE UND AUF WIEDERSEHEN
          ->Alles ist gut wenn es aus Schokolade ist
          1. Hallo romy,

            Es kommt bei mir der Fehler No ending delimiter '^' found ???

            Posix Extended: eregi ("REGEX", ...);
            Perl compatible: preg_match ('/REGEX/i', ...);

            Lies mal das Handbuch zu preg_match.

            Christian

            --
            Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
  3. Hi,

    danke ihr 3

    function checkString($string) {
     $pattern = "/[1]+([._a-zA-Z0-9])*$/";
     if(!preg_match($pattern, $string)) $string="";
     return $string;
    }
    brachte das gewünschte Ergebnis:

    ciao
    romy

    --
    DIE ROMY AUS L. AN DER P. SAGT DANKE UND AUF WIEDERSEHEN
    ->Alles ist gut wenn es aus Schokolade ist

    1. _a-zA-Z0-9 ↩︎

    1. Hi,

      function checkString($string) {
        $pattern = "/[1]+([._-a-zA-Z0-9])*$/";
        if(!preg_match($pattern, $string)) $string="";
        return $string;
      }

      ich habe gelesen, das wenn der Audruck so geschrieben ist, darf der Punkt nicht am Anfang stehen, aber ansonsten überall, aber das stimmt nicht.
      www.gmx.de geht nicht laut dieser RE. (ich kann so nie einen Punkt setzen) Erst wenn der Punkt auch im vorderen Ausdruck ist. Das ist aber nicht Sinn der Sache. (Das Gleiche gilt für den Unterstrich, und den Bindestrich.

      Was kann ich da tun?

      ciao
      romy

      --
      DIE ROMY AUS L. AN DER P. SAGT DANKE UND AUF WIEDERSEHEN
      ->Alles ist gut wenn es aus Schokolade ist

      1. _a-zA-Z0-9 ↩︎

      1. Hi,

        ich habe gelesen, das wenn der Audruck so geschrieben ist, darf der Punkt nicht am Anfang stehen, aber ansonsten überall, aber das stimmt nicht.
        www.gmx.de geht nicht laut dieser RE.

        stop. Was ist der Zweck der RegExp? Wenn Du Hostnamen erkennen willst, gibt es bereits etablierte Muster, die sich nach den Standards richten. Vielleicht solltest Du also erst mal Dein Ziel nennen, bevor Du Dich durch eine lange Evolution hangelst, die evtl. trotzdem nicht beim richtigen Punkt endet.

        Cheatah

        --
        X-Will-Answer-Email: No
        1. Hi,

          stop. Was ist der Zweck der RegExp?

          der Zweck ist bei sämtlichen Einträgen unteranderem auch URI's zu überprüfen ob nur diese erlaubten Zeichen verwendet wurden. Ich will damit in jeglicher Hinsicht irgendwelchen Sicherheitslöchern ausweichen.

          aber trotzdem sollte man w.3 oder romy-166 oder so schreiben können
          aber nicht .profiler oder -romy

          ciao
          romy

          --
          DIE ROMY AUS L. AN DER P. SAGT DANKE UND AUF WIEDERSEHEN
          ->Alles ist gut wenn es aus Schokolade ist
          1. Hi,

            stop. Was ist der Zweck der RegExp?
            der Zweck ist bei sämtlichen Einträgen unteranderem auch URI's zu überprüfen ob nur diese erlaubten Zeichen verwendet wurden. Ich will damit in jeglicher Hinsicht irgendwelchen Sicherheitslöchern ausweichen.

            aha, also geht es um URIs. In Deinem Beispiel war nur ein Hostname genannt worden, was ist z.B. mit einem Protokoll oder einem Localpart?

            aber trotzdem sollte man w.3 oder romy-166 oder so schreiben können
            aber nicht .profiler oder -romy

            Ich glaube, ich habe immer noch nicht verstanden, was für einen Zweck Du verfolgst. Weder in den ersten noch den letzten beiden kann ich irgendeinen Zusammenhang mit URIs erkennen. Allerhöchstens könnte es sich um Hostsegmente bzw. Reihen derselben handeln. Willst Du Subdomains anbieten?

            Cheatah

            --
            X-Will-Answer-Email: No
            1. Hi,

              Ich glaube, ich habe immer noch nicht verstanden, was für einen Zweck Du verfolgst. Weder in den ersten noch den letzten beiden kann ich irgendeinen Zusammenhang mit URIs erkennen. Allerhöchstens könnte es sich um Hostsegmente bzw. Reihen derselben handeln. Willst Du Subdomains anbieten?

              nein nein, es ist viel einfacher als Du denkst.
              Es geht mehr um das Prinzip. Wenn ich einen privaten Bereich habe, kann ja auch jemand seine Web-Adresse angeben wollen, oder aber andere Angaben machen. jedenfalls gibt es einen haufen Eingabefelder, deren Werte alle mal in die Datenbank sollen. Nun möchte ich sie vorher überprüfen. Um es mir einfach zu machen, habe ich mir gedacht ich lasse einfach nur Punkte, Ziffern, Buchstaben, Bindestrich und Unterstrich zu. Aber Bindestrich und Punkt soll nicht am Anfang stehen.

              Jetzt ist das Probelm, das meine RE im Prinzip funktioniert, ABER: wenn ich den Punkt un den Bindestrich aus dem ersten Ausdruck herausnehme, sind sie plötzlich gar nicht mehr erlaubt. Das verstehe ich nicht, da sie ja eigentlich im zweiten Ausdruck erlaubt sind.

              danke echt, dass Du soviel Geduld mit mir hast :)
              Ich wünsch Dir schon mal im vorraus ein schönes WE!

              ciao
              romy

              --
              DIE ROMY AUS L. AN DER P. SAGT DANKE UND AUF WIEDERSEHEN
              ->Alles ist gut wenn es aus Schokolade ist