Reg Exp - Wie bekomme ich sie zusammen ?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Reg Exp - Wie bekomme ich sie zusammen ?

    Tach zusammen und einen wunderschönen Freitag

    ich habe hier ein paar reg exp gebastelt bzw. z.T. gefunden.
    nun möchte ich das sie zusammen kommen.
    In eine Abfrage bekomme ich das wahrscheinlich nicht hin aber das ist auch nicht nötig. Nur wann nimmt man was..


    # Punkte und dashes können nicht zusammen oder am Ende des host stehens

    $host[0] = /(\.|\-)(\.|\-|$)/;


    # hostnamen können nur Buchstaben und Zahlen bzw. Dashes haben und können durch Punkte getrennt werden. Und müssen alphanummerisch beginnen

    $host[0] != /^[a-z0-9][a-zA-Z0-9\-\.]*$/;

    # reine nummerische hostnamen sind nicht erlaubt

    $host[0] = /^[0-9\.]+$/;

    oder

    is_numeric ....

    so sind die Prüfungen auf den gesamten hostnamen.
    z.B. www3.ich.habe.kein3-ahnung.de

    Ist das alles gültig splitte ich den hostnamen in die subdomainen:


    $subdomains= explode (".", $host[0]);

    nun noch folgende Prüfungen:

    # subdomains dürfen nicht weniger als 2 Zeichen haben.

    str_length($subdomains[0]) <2

    hier ein ausdruck den ich nicht hinbekommen habe:

    # 2 dashesdürfen nicht aufeinander folgen
    # Ausnahme : and der 3ten und 4ten stelle dürfen jeweils ein - stehen

    $subdomain[0] != /--/ ?????

    und wieder das alphanummerische ist wieder klar...

    /^[a-z0-9\-]+$/



    wann benutzte ih nun pregmatch replace und wie fasse ich diese vielen abfragen möglichst einfach zusammen ?

    danke schonmal
    Ein blue screen ist nicht immer was schlimmes... es hängt nur davon ab wo er zu sehen ist !
    www.d-creationz.de

  • #2
    PHP-Code:
    $host[0] = 'www3.ich.habe.kein3-ahnung.de';
    $subdomainsexplode ("."$host[0]);

    $ok =
    # 1. Punkte und dashes können nicht zusammen oder am Ende des host stehen. (und auch nicht am Anfang)
    # wichtig: -- darf hier nicht geprüft werden, sonst wird die Ausnahme von 5 ausgehebelt
      
    !preg_match('/((^|\\.)-|(^|\\.|-)(\\.|$))/'$host[0])

    # 2. hostnamen können nur Buchstaben und Zahlen bzw. Dashes haben
    # können durch Punkte getrennt werden.
    # und müssen alphanumerisch beginnen (schon in 1 enthalten)
    &&
      
    preg_match('/^[a-z\\d.-]*$/i'$host[0])

    # 3. rein numerische hostnamen sind nicht erlaubt
    &&
      !
    preg_match('/^[\\d.]+$/'$host[0])

    # 5. zwei dashes dürfen nicht aufeinander folgen
    # Ausnahme: an 3./4. Stelle einer Subdomain
    # Lösung über negative lookbehind-assertion (s. Handbuch, Link unten)
    &&
      !
    preg_match('/(?<!(^|\\.)..)--/'$host[0])
    ;

    for(
    $i=0$ok && $i<count($subdomains); $i++) 
      
    # 4. subdomains müssen mindestens zwei Zeichen haben
      
    $ok str_length($subdomains[$i]) > 1
    1, 3 und 5 können im Prinzip in eine preg gebastelt werden.
    Frage ist nur, ob das im Hinblick auf Performance ratsam ist.

    und:

    "xx--" ist eigentlich keine gültige Subdomain, ebenso wie der Hostname '-bindestrich.de' (beginnt nicht alphanumerisch).
    Ergo ist es einfacher, die (1) in die Schleife einzubauen:
    PHP-Code:
    for($i=0$ok && $i<count($subdomains); $i++) # Subdomains ...
      # 4. ... müssen mindestens zwei Zeichen haben
      
    $ok str_length($subdomains[$i]) > 1
      
    # 1. ... dürfen nicht mit Bindestrich anfangen oder enden
      
    && !preg_match('/(^-|-$)/'$subdomains[$i])
      ; 
    und wie sieht das mit '12.kein3-ahnung.de' aus? oder '123-456.de'?
    Wenn nicht: (3) ab in die Schleife:
    # 3. ... müssen mind. einen Buchstaben enthalten
    && !preg_match('/[a-z]/i', $subdomain[$i])

    P.S.: Wie so oft habe ich das nicht getestet, Syntax-Fehler sind also durchaus möglich.

    und hier der oben erwähnte Link: Handbuch > PCRE Pattern Syntax > Assertions
    mein Sport: mein Frühstück: meine Arbeit:

    Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

    Kommentar


    • #3
      wow danke schonmal wusste doch das der meister der regexpressions sich dem thema annimmt.

      was ich bisher auf die beine gestellt habe:

      PHP-Code:
          if (preg_match("/(\.|\-)(\.|\-|$)/",$host[0])) 
          {echo 
      "Der eingetragene Hostname ist <font color=\"#FF0000\">falsch</font><br>";}
          else
          {echo 
      "Der eingetragene Hostname ist <font color=\"#009900\">richtig</font><br>"$step1 "ok";}

          if (
      $step1 == "ok")
          {
              
      $punkt substr("$host[0]", -1);
                  if (
      $punkt != ".")
                  {echo 
      "Sie haben keinen Punkt gesetzt. <font color=\"#009900\">Richtig</font><br>"$step2 "ok";}
                  else
                  {echo 
      "Sie haben den Punkt gesetzt. <font color=\"#FF0000\">Falsch</font><br>";}
          }
          
          if (
      $step2 == "ok")
          {
          
      $subdomains split ("\.",$host[0]);
          
      $anzahl count ($subdomains);
          
          echo 
      "Elemente = $anzahl<br>";
          
          if (
      $anzahl == && $subdomains[0] == "")
                  { echo 
      "Der leere Hostname ist erlaubt. <font color=\"#009900\">Richtig</font><br><br>";}
              
          for (
      $i=0$i<$anzahl$i++)
              {
              
              
                  if (
      preg_match("/^[0-9\.]+$/",$subdomains[$i])) 
                      {
                      echo 
      "Der Eintrag $subdomains[$i] ist nicht alphanummerisch<br>";
                      }
                  else
                      {
                      echo 
      "Der Eintrag $subdomains[$i]  ist richtig<br>";
                      }
              echo 
      "$i resultes : $results[$i]<br>";
              }    
          } 
      ich bastel deine genialen ansätze da mal ein. aus die waere ich alleine nicht gekommen.

      nur eins noch

      xx-- ist ein gültiger name. Stichwort IDN Internationalisierte Domainnamen.

      da wird aus www.schröder.de --> www.xn--schrder-d1a.de

      somit ist das ganze gültig. Schlimmer wir es noch bei den ganzen anderen Zeichen wie è ê ô ò è etc. ist ja auch alles bald erlaubt.
      insofern wollte ich die Plauselprüfung direkt im puny code machen sonst bastel bzw. schreibe ich mich tot.

      Der IE kann standardmäßig umlaute in urls nicht anzeigen.
      Damit er das kann gibts plugins
      IDN Plugin für IE . Morzilla und co können es schon.

      IDN TEST

      Also danke nochmal ich baste mal weiter. So langsam weicht meine Angst von Reg Exp ein wenig
      Ein blue screen ist nicht immer was schlimmes... es hängt nur davon ab wo er zu sehen ist !
      www.d-creationz.de

      Kommentar


      • #4
        Original geschrieben von reaVen
        Der IE kann standardmäßig umlaute in urls nicht anzeigen.
        kann er nicht? also ich sitze gerade vor einem IE 5.0, und wenn ich mit dem auf deinen test-link
        IDN TEST
        klicke, gelange ich auf eine seite, auf der

        big-mäc.d-creationz.de wurde noch nicht weitergeleitet
        Bitte setzen Sie sich ggfs. mit dem Support in Verbindung.

        server.s19.evanzo-server.de


        steht ...
        I don't believe in rebirth. Actually, I never did in my whole lives.

        Kommentar


        • #5
          Original geschrieben von wahsaga
          kann er nicht? also ich sitze gerade vor einem IE 5.0, und wenn ich mit dem auf deinen test-link
          IDN TEST
          klicke, gelange ich auf eine seite, auf der

          big-mäc.d-creationz.de wurde noch nicht weitergeleitet
          Bitte setzen Sie sich ggfs. mit dem Support in Verbindung.

          server.s19.evanzo-server.de


          steht ...
          Nö kann er nicht denn wenn er es könnte würdest du eine schöne seite sehen und keine fehlermeldung

          teste mal den link das ist der selbe im direkten punycode
          selber link
          Zuletzt geändert von reaVen; 09.01.2004, 15:32.
          Ein blue screen ist nicht immer was schlimmes... es hängt nur davon ab wo er zu sehen ist !
          www.d-creationz.de

          Kommentar


          • #6
            also ich habe die ansätze mal alle umgesetzt und denke damit komme ich weiter.
            Nun habe nich noch Fragen.
            1. Wie fange ich ab das keine anderen zeichen erlaubt sind wie z.B.
            ; , # * / % usw.

            Mein Ansatz ich definiere die erlaubten Zeichen:
            [a-zA-Z0-9.-äÄöÖüÜßéèêáàâ] usw.
            und mache ein preg_match_all ?

            Ich habe das mit den IDN ´s heraus genommen und lasse den Benutzer nun die Domainen mit Umlauten etc eingeben und teste mit

            $search = array("ä","ö","ü","ß");

            ob ein erlaubtes sonderzeichen vorkommt und wenn ja benutze ich ein php-modul für IDNs

            Dementsprechend mache ich wie von dir vorgeschlagen eine überprüfung auf 2 - und wenn ja falsch

            2. !preg_match('/(-)?/',$subdomains[$i]);

            Der Ausdruck sagt doch 0 oder exakt 1 Strich ?

            Danke nochmal wenn ich das alles eingebaut habe lade ich den Quelltext hier hoch.
            Ein blue screen ist nicht immer was schlimmes... es hängt nur davon ab wo er zu sehen ist !
            www.d-creationz.de

            Kommentar


            • #7
              Original geschrieben von reaVen
              1. Wie fange ich ab das keine anderen zeichen erlaubt sind wie z.B.
              ; , # * / % usw.

              Mein Ansatz ich definiere die erlaubten Zeichen:
              [a-zA-Z0-9.äÄöÖüÜßéèêáàâ-] usw.
              und mache ein preg_match_all ?
              Dafür ist strspn besser geeignet. Wenn die Rückgabe identisch mit der von strlen ist, kommt kein anderes Zeichen vor.
              Mit regulärem Ausdruck müsste das einsame Minus nach hinten in die Zeichenklasse (oder ein Backslash muss davor) und es reicht ein einfaches preg_match.
              $erlaubt = '[a-zA-Z0-9.äÄöÖüÜßéèêáàâ-]';
              $ok = preg_match("/^$erlaubt\$/", $host[0]);

              Der Ausdruck sagt doch 0 oder exakt 1 Strich?
              Im Prinzip ja, aber das trifft auch auf '--' zu.
              Die einfachst Methode ist wohl, erstmal den IDN aufzulösen, dann auf korrekte Zeichen zu prüfen und anschließend wieder zurück zu codieren;
              allerdings sind dann die Internationalen Zeichensätze (arabisch, kyrillisch, chinesisch etc.) außen vor.
              mein Sport: mein Frühstück: meine Arbeit:

              Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

              Kommentar


              • #8
                wie versprochen hier meine funktionen danke nochmal @ Titus


                PHP-Code:
                function valid_hostname ($host,$empty)
                    {
                        if (
                $empty != && $host == "")
                        {
                $valid false; return $valid; break;}
                        
                        if (
                $host == "")
                            { 
                $valid true; return $valid;}
                        else
                            {
                            if (
                preg_match("/((^|\.)-|(^|\.|-)(\.|$))/",$host)) 
                                {
                $valid false; return $valid; break;}
                            else
                                {
                                    
                $subdomains split ("\.",$host);
                                    
                $anzahl count ($subdomains);
                                        for (
                $j=0$j<$anzahl$j++)
                                            {
                                            
                // 2. Subdomains müssen mindestens zwei Zeichen habe
                                                
                if (strlen($subdomains[$j]) > 1)
                                                    {
                $valid true;}
                                                else
                                                    {
                $valid false; break 1;}        
                                            
                // 1. Subdomains dürfen nicht nummerisch sein
                                                
                if (preg_match("/^[0-9\.]+$/",$subdomains[$j])) 
                                                    {
                $valid false; break 1;}
                                                else
                                                    {
                $valid true;}
                                                
                                            }
                                    return 
                $valid;                                            
                                }
                            }
                    } 
                und für ne IP

                PHP-Code:
                function valid_ip ($ip)
                    {
                        if (
                $ip == "")
                            { 
                $valip false; }
                        else
                            {
                            
                $validipsplit("\.",$ip);
                            
                $result count ($validip);
                            if (
                $result != 4)
                                {
                $valip false;}
                            else
                                {
                                    for (
                $y=0$y<$result$y++)
                                        {
                                        
                $value is_numeric($validip[$y]);
                                        if (
                $value != true
                                            {
                $valip false; break;} 
                                        else
                                            {
                                                if (
                $validip[$y] >= && $validip[$y] <= 255
                                                    {
                $valip true; } 
                                                else 
                                                    {
                $valip false; break;}
                                            }
                                        }
                                }        
                            return 
                $valip;
                            }
                    } 
                ich hoffe jemand kann sie gebrauchen.
                Ein blue screen ist nicht immer was schlimmes... es hängt nur davon ab wo er zu sehen ist !
                www.d-creationz.de

                Kommentar


                • #9
                  PHP-Code:
                  valid_ip($ip='')
                  {
                    return isset(
                  $ip) and ip2long($ip)!==-1;

                  geht das nicht auch?
                  Ich denke, also bin ich. - Einige sind trotzdem...

                  Kommentar


                  • #10
                    Hallo

                    Das ist genau mein Problem!

                    Ich suche ein PHP Script, dass aus www.schröder.de --> www.xn--schrder-d1a.de macht.

                    reaVen, du schreibst etwas von einem PHP Modul für IDN's, wo findet man das?

                    Besten Dank und Gruss
                    Mike

                    Kommentar


                    • #11
                      Lang lang ist her

                      IDN MODUL
                      Ein blue screen ist nicht immer was schlimmes... es hängt nur davon ab wo er zu sehen ist !
                      www.d-creationz.de

                      Kommentar

                      Lädt...
                      X