Variable Suche mit preg_match

Fragenfrager

Erfahrenes Mitglied
Hallo liebes Forum,

ich habe einen Passwortgenerator gebaut. Dieser liefert mir ein Passwort zwischen 5 und 7 Zeichen (je nach Einstellung).
Grundsätzlich enthält das Kennwort Kleinbuchstaben. Optional sollen Großbuchstaben, Ziffern und die Zeichen#,&,@,$,_,%,?,+ enthalten sein.
Da das Passwort aus einem Array der möglichen Zeichen zufällig generiert wird, kann es passieren, dass zB trotz der aktivierten Option "Ziffern" das Kennwort nur Groß- und Kleinbuchstaben enthält. In diesem Fall sollte die Generierung erneut aufgerufen werden.
Bisher sieht das so aus:
PHP:
function generatePW($length)	
{ 		
  $dummy	= array_merge (range('a', 'z'));

  if (isset($_POST['AZ']))
  { 
    $dummy= array_merge ($dummy,range('A', 'Z'));
  }
  if (isset($_POST['09']))
  {
   $dummy= array_merge ($dummy,range('0', '9'));
  }
  if (isset($_POST['sonderzeichen']))
 {
   $dummy= array_merge ($dummy,array('#','&','@','$','_','%','?','+'));
 }

// hier folgt die Passwortgenerierung, das Ergebnis ist $pw; den Code lasse ich hier aus.

 $check=TRUE;
  
//Überprüfung, ob Großbuchstaben vorkommen sollen
  if (isset($_POST['AZ']))
 {
   
   if (!(preg_match("#^[a-zA-Z]+$#",$pw) ))
   {
   $check=FALSE;
   }  
 }       

  // HIER WIRD HILFE BENÖTIGT

  if ($check)
  {	
   return $pw;
  }
  else  
  {
  generatePW($length);
  }	

)//end function
Bei // HIER WIRD HILFE BENÖTIGT ist der Part, an dem ich nicht weiterkomme.
Schön wäre eine Code, der mir mein Preg_match dynamisch zusammensetzt, da ich ansonsten für alle 9 Kombinationen aus Großschreibung, Ziffern und Sonderzeichen ein eigenes IF (!preg_match.... ) machen müsste.
Ich komme an dieser Stelle gedanklich nicht weiter...
 
Ich würde 4 Prüfungen machen.

PHP:
//Kleinbuchstaben
$valid = (preg_match('/[a-z]/', $pw) = 1);
//Grossbuchtaben
if($valid) $valid = (preg_match('/[A-Z]/', $pw) = 1);
//Zahlen
if($valid) $valid = (preg_match('/[0-9]/', $pw) = 1);
//Sonderzeichen
if($valid) $valid = (preg_match('/[#&@$_%\?+]/', $pw) = 1);

Das ganze ungetestet
 
Zufall ist Zufall. Ich würde das als nicht so schlimm ansehen, wenn keine Zahlen enthalten sind.
 
Das Problem ist, dass es auch Kombinationen geben kann:
Kleinbuchstaben und Ziffern
Kleinbuchstaben und Sonderzeichen
Kleinbuchstaben und Großbuchstaben und Ziffern
Kleinbuchstaben und Sonderzeichen und Ziffern
Kleinbuchstaben und Großbuchstaben
Kleinbuchstaben und Sonderzeichen und Großbuchstaben
....
 
Verlagere die Prüfungen (siehe yaslaw) in eigene Funktionen, die true oder false zurückgeben.

was du suchst ist rekursion, im einfachsten Fall kannste das mit einer while-Schleife implementieren.

PHP:
$check = false;

while ($check === false) {
	$password = generatePW($length);

	$check = containsNumbers($password);
}

return $password;
 
@alxy:
Soweit ist es mir klar, doch bei Deinem containsNumers() müsste ich ja mitgeben, welche der Kombinationen gewünscht ist. Es kann, wie oben geschrieben, der Fall sein, dass Kleinbuchstaben und Sonderzeichen gewünscht sind, aber keine Ziffern. Oder Kleinbuchstaben, Großbuchstaben und Ziffer aber keine Sonderzeichen...
Diese Bedingungen möchte ich abfangen. Ich hoffe, ich drücke mich verständlich aus?
 
Dann erstellst du eben noch containsLowercase, containsUppercase, containsSpecial ?
Du kannst auch das Pattern alternativ dynamisch zusammenbasteln, ich verstehe allerdings das Problem nicht. Das sind doch simpelste if-Bedingungen.
 
Der Denkfehler war, dass ich für jede der möglichen Kombinationen einen eigenen Regulären ausdruck erstellen wollte.
Wenn ich aber bei der Auswahl der Pararmeter (Großschreibung, Ziffern, Sonderzeichen) diese als Flag mitgebe, lässt sich das natürlich einfach in einer Funktion mittels mehrerer IF-Anweisugen in Reihe prüfen.
So, und falls nun noch jemand den Code sehen möchte:
PHP:
function checkPW($pw,$abisz,$ziffern,$soz)
{
  if ($abisz)
 {
   if (!(preg_match("#[A-Z]#",$pw) ))
   {
   return false;
   }  
 }   
  if ($ziffern)
 {
   if (!(preg_match("#[0-9]#",$pw) ))     
   {
   return false;
   }  
 } 
 if ($soz)
 {
   if (!(preg_match("#[@\$_%?\+]#",$pw) ))   
   {
   return false;
   }  
 } 

   return TRUE;
}   // end function  checkPW
 
 
 
// Erzeugt ein Passwort
function generatePW($length)	
{ 		
  $dummy	= array_merge (range('a', 'z'));   // Array mit Werte a-z erzeugen
  $abisz=FALSE;  // alle Möglickeiten auf FALSE setzen
  $ziffern=FALSE;
  $soz=FALSE;

  if (isset($_POST['AZ']))
  {
    $dummy	= array_merge ($dummy,range('A', 'Z'));  // Array um A-Z ergänzen
    $abisz=TRUE;
  }
  if (isset($_POST['09']))
  {
    $dummy	= array_merge ($dummy,range('0', '9'));    // Array um 0-9 ergänzen
    $ziffern=TRUE;
  }
  if (isset($_POST['sonderzeichen']))
  {
    $dummy	= array_merge ($dummy,array('@','$','_','%','?','+')); // Array um Sonderzeichen ergänzen
    $soz=TRUE;
  }
		
 		
  mt_srand((double)microtime()*1000000);				
  for ($i = 1; $i <= (count($dummy)*2); $i++)		
  {			$swap		= mt_rand(0,count($dummy)-1);			
        $tmp		= $dummy[$swap];			
        $dummy[$swap]	= $dummy[0];			
        $dummy[0]	= $tmp;		
  } 		
  // get password 	
 $pw=substr(implode('',$dummy),0,$length);         // PW erzeugen

 $correctPW= checkPW($pw,$abisz,$ziffern,$soz);
 
 if ($correctPW)
  {	
   return $pw;
  }
  else  
  {
  generatePW($length);
  }	
  
} // End function
PHP:
// Hier folgt das das Formular

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
      <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">

  <head>
      <title>Passwortgegerierer</title>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
      <link rel="stylesheet" type="text/css" href="incs/style.css" />   
  </head>
  <body>
  <?php 
  if (isset ($_post['anzahl']))
  {
    echo $_post['anzahl'];
  } // end if 
   ?>
    <div align="center" width="90%" border="1">
      <form action="index.php"  method="post">
      <table border="1">
        <tr>
          <th>
            Anzahl der Stellen
          </th>  
          <th>
            <select name="anzahl" size="1">
              <?php
              for($i = 5; $i < 11; $i++)
              {
                echo "<option";
                if ($i==$length)
                {
                  echo " selected='selected'";
                }
                echo ">";
                echo $i;
                echo "</option>";
               }              
              
              ?>
            </select>
          </th> 
        </tr>
        <tr>
          <th>
            a..z
          </th>
          <td>
            <input type="checkbox" name="az" value="az" checked="checked" disabled="disabled">
          </td>
        </tr>
          <th>
            A..Z
          </th>
          <td>
            <input type="checkbox" name="AZ" value="AZ"
            <?php
            if (isset($_POST['AZ']))
            {
            echo "checked='checked'";
            }
            ?>
             >
          </td>
        </tr>
        <tr>
          <th>
            0..9
          </th>
          <td>
            <input type="checkbox" name="09" value="09"
            <?php
            if (isset($_POST['09']))
            {
            echo "checked='checked'";
            }
            ?>
            >
          </td>
        </tr>
        <tr>
          <th>
            Sonderzeichen @,$,_,%,?,+
          </th>
          <td>
            <input type="checkbox" name="sonderzeichen" value="sonderzeichen"
            <?php
            if (isset($_POST['sonderzeichen']))
            {
            echo "checked='checked'";
            }
            ?>
            >
          </td>
        </tr>
        <tr>
          <th>
            Passwort:
          </th>
          <th>
              <input name="passwort" type="text" size="20"  maxlength="10" readonly="readonly" value="
              <?php
                $pw=generatePW($length); 
                $pw=trim($pw);
                echo $pw;
              ?>
              " />
          </th>
        </tr>
        <tr>
          <th colspan="2">
            <input type="submit" value=" Neu generieren ">
          </th>
        </tr>
      </table>
    </form>
    </div>
  </body>
</html>

Das funktioniert soweit so gut. Nur wenn das gepüfte Passwort nicht den Vorgaben entspricht, wird scheinbar generatePW nicht wieder aufgerufen, sondern das Feld bleibt leer. Es muss erneut auf <Neu generieren> geklickt werden, damit ein neues Passwort erstellt wird. Hat hierzu noch jemand eine Lösung?
 
Zuletzt bearbeitet:
Jup habe ich. Dir fehlt vermutlich nur ein kleines return, und zwar hier:

PHP:
else  
  {
  return generatePW($length);
  }
 
Zurück