buzz: reguläre Ausdrücke für Homepage und Mailadressen

Hallo,

da ich mich erst seit kurzem überhaupt etwas mit regulären Ausdrücken beschäftige und noch nicht den Durchblick habe (http://www.php-resource.de/tutorials/read/10/1/), wollte ich mal eure Meinung zu folgenden Ausdrücken haben:

1.Homepages:
preg_match("/[1][a-z|ä|ö|ü|ß|.|_|-]+[a-z|ä|ö|ü|ß]{1}(.){1}[a-z|ä|ö|ü|ß]{2,4}[.]*/i",$homepage);
___
Anmerkungen:
a) bin ich mit dem . am Ende natürlich nicht zufrieden, aber ich kenne mich mit den möglichen zeichen in einer URL zu wenig aus. (Vielleicht hat jemand nen Link wo man dazu gute Infos findet.
b) was für Protokolle gibt's noch? Kann man überhaupt alle beachten?
Und was ist, wenn der Vorsatz einfach fehlt und z.B. bei einer Usereingabe nur www.blabla.de eingegeben wurde?
c) was ist mit Sonderzeichen, Umlauten, %20 und Co??
In welchen Teilen der URL dürfen diese Vorkommen?

2.Mailadressen:
preg_match("/[2]+[a-z|0-9|ä|ö|ü|ß]{1}(@){1}[a-z|0-9|ä|ö|ü|ß|.|_|-]*[a-z|0-9|ä|ö|ü|ß]{1}(.){1}[a-z|0-9|ä|ö|ü|ß]{2,4}$/i",$mailadress);
___
Anmerkungen:
a) was ist mit Sonderzeichen, Umlauten, %20 und Co??
In welchen Teilen der Mailadresse dürfen diese Vorkommen?

Wäre für jede Antwort dankbar!
Vielleicht könnte ich mit eurer Hilfe einen weit ausgereiften regExp basteln...

Danke im Voraus

Schöne Grüße aus dem zurzeit sonnigen BaWü


  1. (http://)|(ftp://)|(https://) ↩︎

  2. a-z|0-9|ä|ö|ü|ß|.|_|- ↩︎

  1. Hallo buzz.

    Vielleicht könnte ich mit eurer Hilfe einen weit ausgereiften regExp basteln...

    Viel Spaß dabei

    Ich persönlich halte meine Validierungen so einfach wie möglich, da ich niemals sämtliche erlaubten Adressen berücksichtigen kann und hierdurch so genannnte „false positives“ erzeugen würde.

    Normale Web-Adressen müssen mit „http://“ beginnen und mindestens einen Punkt enthalten.

    E-Mail-Adressen müssen mindestens einen Punkt und genau ein @ enthalten und der letzte Punkt in der fraglichen Zeichenkette muss sich hinter dem @ befinden.

    Diese grobe Überprüfung hat bisher immer genügt. Zudem ist hierfür kein komplexer regulärer Ausdruck erforderlich, da einfache Zeichenkettenfunktionen wie strpos, strrpos und substr_count vollkommen ausreichen. Der Performance des jeweiligen Scriptes kann dies nur dienlich sein.

    Danke im Voraus

    Danke auch dir.

    Einen schönen Freitag noch.

    Gruß, Mathias

    --
    sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
    „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
    [HTML Design Constraints: Logical Markup]
    1. danke für die Antwort!

      Werd dann mal sehn, ob ich auch auf einen "einfachen" regeExp umsteige oder...?

      VORAUS
      mach ich doch gern ^^

  2. Hi,

    da ich mich erst seit kurzem überhaupt etwas mit regulären Ausdrücken beschäftige und noch nicht den Durchblick habe (http://www.php-resource.de/tutorials/read/10/1/), wollte ich mal eure Meinung zu folgenden Ausdrücken haben:

    bei URLs und Mailadressen existieren viel zu viele Fehlerquellen (besonders bei letzteren), als dass es sich lohnen würde, von den RFC-konformen RegExp abzuweichen, die immer wieder in diesem Forum gepostet und verlinkt werden.

    /^

    "String beginnt mit", soweit so gut.

    [(http://)|(ftp://)|(https://)]

    "Das nächste Zeichen muss '(', 'h', 't', 'p', ':', '/', ')', '|', 'f' oder 's' sein" - das hat mit URLs nur wenig zu tun. Übrigens hast Du ziemlich viele Zeichen doppelt in die Zeichenklasse geschrieben.

    [a-z|ä|ö|ü|ß|.|_|-]+

    "Ein oder mehrere 'a'-'z', '|', Umlaute, '.', '_' oder '-'" - dito. Wenn Du internationale Domains beachten willst, dann tue dies bitte mit _allen_ erlaubten Sonderzeichen. Der Unterstrich hat im Hostnamen nichts verloren, genauso wenig wie "...", was bei Dir erlaubt wäre. Davon abgesehen sind wir hier natürlich noch gar nicht beim Hostnamen, weil der vorherige Teil der RegExp nicht stimmt.

    [a-z|ä|ö|ü|ß]{1}

    "Ein bis ein Buchstabe oder Umlaut" - bitte wie? Vom überflüssigen "{1}" abgesehen ist "example.17n" wenig sinnvoll, "172.251.0.12" hingegen schon.

    (.){1}

    "Ein bis ein Punkt" - wo genau in der URL glaubst Du zu sein?

    [a-z|ä|ö|ü|ß]{2,4}

    Äh, aha. Vermutlich willst Du hier ".com", ".de", ".info" usw. abfrühstücken, also auch ".museum", aber nicht ".bäh". Hast Du Dir eigentlich schon mal angesehen, wie eine URL aufgebaut ist?

    [.]*

    "Beliebig viele Punkte" - nein, die sind direkt nach dem Hostnamen nicht erlaubt. Statt dessen kommt entweder eine Port-Angabe, oder der Localpart der URL.

    /i

    "Das ganze case-insensitive, und es darf folgen was will."

    a) bin ich mit dem . am Ende natürlich nicht zufrieden,

    Ich bin mit _nichts_ in Deiner RegExp zufrieden. Richte Dich bitte nach den bestehenden, standardkonformen Lösungen.

    b) was für Protokolle gibt's noch?

    Beispielsweise "pros pero". Das Leerzeichen dient dazu, dass derjenige, der danach sucht, die richtigen Artikel findet, nicht diesen hier.

    Kann man überhaupt alle beachten?

    Je nach Definition von "alle": ja.

    Und was ist, wenn der Vorsatz einfach fehlt und z.B. bei einer Usereingabe nur www.blabla.de eingegeben wurde?

    Wenn Du URLs matchen willst, ist "www.blabla.de" eh nicht gefordert.

    c) was ist mit Sonderzeichen, Umlauten, %20 und Co??

    Die stecken in dem Teil, den Du gepflegt ausgelassen hast.

    2.Mailadressen:

    Das lasse ich gleich weg, die RegExp ist eh falsch. Bedenke, dass z.B. "I'm a valid em@il-address!"@example.com eine valide E-Mail-Adresse ist, invalid.@example.com jedoch nicht.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Danke für deine Ausführlich Antwort.

      also weiß nicht was du gegen . hast?
      . ist eine Metacharaktere, die auf alles matcht, was nicht leer ist und kein zeilenumbruch (http://www.php-resource.de/tutorials/read/10/1/)
      und was soll mit /i sein?
      Modifier, der die Unterscheidung zwischen Groß und Klein-schreibung "abstellt"
      Aber egal.

      deine erste Bemerkung ist mir wichtig!
      Wo finde ich die genau?

      1. Hi,

        also weiß nicht was du gegen . hast?

        nichts, vorausgesetzt er springt.

        . ist eine Metacharaktere,

        Innerhalb einer Zeichenklasse steht "." für ".".

        und was soll mit /i sein?

        Das ist in Ordnung. Was nicht in Ordnung ist ist das, was davor fehlt.

        deine erste Bemerkung ist mir wichtig!
        Wo finde ich die genau?

        Meine erste Bemerkung findest Du im obersten Teil meines Postings ;-) Wo (bzw. wie) Du das findest, was ich in der ersten Bemerkung bemerkte, bemerkte ich in einer späteren Bemerkung. Vielleicht hast Du es nur nicht bemerkt.

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. Hi,

          ich meinte Natürlich die deine Bemerkung von den RFC-konformen RegExp. Und wo ich eben diese genannten RFC-konformen RegExp bzw. die Links dazu finde???

          Danke

    2. Hallo Cheatah.

      Bedenke, dass z.B. "I'm a valid em@il-address!"@example.com eine valide E-Mail-Adresse ist, invalid.@example.com jedoch nicht.

      Letzteres werde ich in meine Validierung einbauen, danke.

      Einen schönen Freitag noch.

      Gruß, Mathias

      --
      sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
      debian/rules
  3. Servus,

    preg_match("/[1]
    [a-z|ä|ö|ü|ß|.|_|-]+

    [...]

    Uwah! :-)

    [(http://)|(ftp://)|(https://)]

    dieses Konstrukt "darf" nicht in eine Charakterklasse, wenn die
    einzelnen Zeichenketten im Zusammenhang betrachtet werden sollen.

    Möglich wäre: '(http://|ftp://|https://)'

    [a-z|ä|ö|ü|ß]{1}

    1. Innerhalb von Charakterklassen gilt implizit die Oder-Bedingung,
       da werden also keine Trenn- oder Bedingungszeichen benötigt.

    Möglich wäre: '[a-zäöüß]'

    2. '[lba]{1}' ist synonym mit '[lba]'

    [.]*

    Synonym mit '.*'; Du brauchst für ein unbedingtes Zeichen keine
    Klasse. Allerdings wird in beiden Fällen nach einem Punkt in
    höchstmöglicher Anzahl gesucht; ich bin mir nicht sicher, dass Du
    das möchtest. ;-) Ansonsten wäre es: '.*', aber auch das ist mit
    Vorsicht zu geniessen.

    Ich schlage vor, Du bügelst diese Dinge erst einmal aus, dann
    können wir uns den Ausdruck weiter ansehen. :-)

    Grüsse


    1. (http://)|(ftp://)|(https://) ↩︎