Page 1 sur 1

Supprimer les caractères d'une chaine

Posté : 21 juin 2006, 14:26
par HanX
Voilà je suis en train de générer des login/pass. Le code est nickel, sauf que lorsque je génère certains pass, ça me sort des caractères de ponctuation :oops: Je veux que des lettres (maj ou min je m'en fous) et des chiffres

J'ai regardé la doc de preg_replace() mais j'ai rien compris :?
<? 
include 'connexion.php';
$prenom='Jacques';
$nom='Chirac';
$login=gen_login($prenom,$nom);
$pass=gen_pass($login,$prenom);


///*************************************************

function gen_login($prenom,$nom) {
$login=substr($prenom, 0, 1);
$pos = strpos($nom,'-');
if ($pos)
	{ $nom=substr($nom,0,$pos); }

$login.=$nom;
$login=strtolower($login);
$ok=false;
while(!$ok)
	{
	if(veriflogin($login))
		{ $ok=true; }
	else
		{
		$i++;
		$login.=$i;
		}
	}
echo 'LOGIN : '.$login.'<br>';
return $login;
}


function gen_pass($login,$prenom) {
$pass=strtolower(crypt($login,$prenom));
if(strlen($pass)>8)
	{ $pass=substr($pass, 0, 8);}
echo 'PASS  : '.$pass.'<br>';
return $pass;
}
//*******************************************//

function veriflogin($login) {
$sql="select login from partenaires where login='".$login."'";
$res=mysql_query($sql);
if (mysql_num_rows($res)>0)
	{ return false; }
$sql="select login from candidats where login='".$login."'";
$res=mysql_query($sql);
if (mysql_num_rows($res)>0)
	{ return false; }
return true;
}
?> 
Dans le cas, jacques chirac (vive le jeu d'essai, non ?) ça m'affiche :

Code : Tout sélectionner

LOGIN : jchirac PASS : ja7/cqty

Posté : 21 juin 2006, 15:10
par Orni
$test = "ja7/cqty";
$test = ereg_replace( "[^a-zA-Z0-9]" , "" ,  $test );
Dans ce cas $test devrait égaler : ja7cqty

Posté : 21 juin 2006, 15:16
par zigz4g
Salut.

Petit problème avec la solution du ereg_replace, c'est que ton mot de passe peut devenir trop petit voir même nulle.
$test = "//{][$#@";
$test = reg_replace( "[^a-zA-Z0-9]" , "" ,  $test );
echo $test;// donne ''
J'exagère bien sur mais je montre le petit problème.
Je regarderais au minimum la longueur de la chaîne ou je ferais une fonction avec un random (fonction rand()).

Posté : 21 juin 2006, 15:21
par Orni
Oui c'est vrai, mais bon il demandait une solution pour garder que les bons caractères :lol:

Sinon solution simple pour générer un pass plutôt dur :
$pass = substr( md5( rand() * 1000 ) , 0 , 10 );
echo $pass;
10 de longueur, que des chiffres et des lettres minuscules. Après on peut toujours trafiquer pour faire quelques majuscules ^____^

PS : Sans substr() le pass fait 32 de long.

Posté : 22 juin 2006, 14:27
par goeb
ou bien, pour générer des caractères aléatoirement :
$resultat = '';
$nombre_de_caracteres = 10;
for ($i=0; $i<$nombre_de_caracteres; $i++) {
  $n = rand(0, 35); // 36 valeurs possibles
  if ($n < 10) $c = chr($n+40); // caractères de 0 à 9
  else $c = chr($n+55); // caractères de A à Z
  $resultat .= $c;
}

Posté : 22 juin 2006, 14:33
par Orni
Bonne solution également :] Je prends Image

Posté : 22 juin 2006, 15:37
par HanX
$pass = substr( md5( rand() * 1000 ) , 0 , 10 );
echo $pass;
très bon j'adopte :) et merci :D