funzione preg_match

achille610

Utente Attivo
18 Mag 2015
34
0
6
Ciao a tutti,
aiutandomi con uno script che ho trovato sul vostro sito ho creato un form di registrazione con email di conferma, e fino a qui nn ho avuto problemi tutto funziona.

Nello script come controllo c'è la funzione preg_match con l'istruzione
PHP:
(!preg_match("/^[a-z0-9]+$/i", $_POST['password'])) || (strlen(trim($_POST['password']) >
per il controllo della password con caratteri alfanumerici e se inserisco abcd1234 funziona ... chi mi aiuta a capire cosa devo mettere per avere in questa funzione il controllo di vari caratteri e nn solo caratteri alfanumerici es vorrei dare la possibilità come in qualsiasi sito di avere una password magari con massimo 10 caratteri (questo conteggio lo fa già lo script) ma es pippo@123 oppure 12pippo@we

for_registrazione.php

PHP:
<?php
// controllo sul parametro d'invio
if(isset($_POST['submit']) && (trim($_POST['submit']) == "Iscriviti"))
{ 
  // controllo sul formato dell'email
  if((!isset($_POST['email'])) || (!eregi("^([a-z0-9\._-]+)(@[a-z0-9.-]+)(\.{1}[a-z]{2,4})$", $_POST['email'])))
  {
    echo "Attenzione, formato email non valido.";
  }
  // controllo sul formato della password deve essere alfanumerica e non deve superare i dieci caratteri di lunghezza
  elseif((!isset($_POST['password'])) ||  ($_POST['password'] == "") || (!preg_match("/^[a-z0-9]+$/i", $_POST['password'])) || (strlen(trim($_POST['password']) > 10)))
  {
    echo "La password deve essere alfanumerica e non più lunga di 10 caratteri.";
  }else{
    // se i parametri sono corretti popoliamo il database
    $email = $_POST['email'];
    $password = $_POST['password'];

    // ma prima controlliamo che la mail non sia già presente includiamo il file di configurazione
    @include "config.php";

    $ctrl_mail = @mysql_query("SELECT id FROM users WHERE email='$email'") or die (mysql_error());
    if(@mysql_num_rows($ctrl_mail)>0)
    {
      echo "L'email risulta già stata registrata.";
    }else{
      // query d'inserimento
      if(@mysql_query("INSERT INTO users (email, password) VALUES('$email','$password')") or die (mysql_error()))
      {
        // messaggio di conferma
        echo "Conferma l'iscrizione tramite la mail che ti abbiamo inviato.";

        // email per la conferma
        // intestazioni
        $headers = "From: $admin_email\nreply-To: noreply\r\n";
        $subject = "Conferma la tua iscrizione.";
        //corpo del messaggio
        $messaggio = "Ti ringraziamo per la tua iscrizione.\n";
        $messaggio .= "La tua user è: ".$email."\n";
        $messaggio .= "La tua password è: ".$password."\n";
        $messaggio .= "Per confemare vai alla pagina http://miosito.it/conferma.php ";
        $messaggio .= "e inserisci i dati per l'autenticazione.\n"; 
        // invio dell'email
        @mail($email, stripslashes($subject),stripslashes($messaggio),$headers);
      }
    }
  } 
}else{
  // form per l'iscrizione
  ?>
<h1>Modulo d'iscrizione:</h1>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
Email:<br>
<input name="email" type="text" size="20"><br>
Password: (max 10 caratteri alfanumerici)<br>
<input name="password" type="password" size="20"><br>
<input name="submit" type="submit" value="Iscriviti">
</form>
  <?
}
?>
 
ciao
non ho capito bene
vorresti che la pass sia formata da es. 5 caratteri alfanumerici e un carattere speciale es come hai scritto la @?
poi dici massimo 10, ma ti conviene anche determinare il minimo es 5
poi un paio di cose:
1) abbandona la funzione eregi è deprecata
puoi fare così
PHP:
<?php
//.....
if(!isset($_POST['email']) || !filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)){
		echo "Attenzione, formato email non valido.";;
}
//.....
?>
2) non salvare in chiaro la password, ma dei criptarla almeno con sha1
PHP:
<?php
//.....
$password = sha1($_POST['password']);
//.....
?>
 
Ho fatto questo esempio che puoi semplicemente ampliare o modificare a tuo piacimento..
Attualmente puoi inserire password ( che verranno accettate ) con min 5 e max 10 caratteri
verranno accettati solamente caratteri alfanumerici con lettere minuscole..

Se vuoi aggiungere simboli puoi aggiungerli dopo la @ se vuoi aumentare o diminuire il max e min caratteri puoi modificare {5,10}

PHP:
<?php
$password = 'abcd@12343';

if (preg_match("/^[a-z0-9@]{5,10}+$/i", $password )) {
    echo 'pass ok!';
}else{
    echo 'pass not ok!';
}

In questo caso passa..
 
Ultima modifica:
Ciao, giusto per spiegare meglio aggiungo qualche dettaglio oltre a quanto già ti è stato risposto.

Consideriamo il pattern della tua espressione regolare:
Codice:
^[a-z0-9]+$
In particolare prendiamo la parte che sta tra le parentesi quadre:
Codice:
[a-z0-9]
Le parentesi quadre specificano una classe di caratteri. Questo trova un qualsiasi carattere tra quelli specificati tra le parentesi. In questo caso a-z identifica qualsiasi lettera tra la "a" e la "z", mentre 0-9 identifica qualsiasi numero da 0 a 9.

Considera inoltre che alla fine della tua espressione regolare è specificato il modificatore "i" che sta a significare "ignore case", cioè, nella ricerca, non sarà fatta distinzione tra lettere maiuscole o minuscole.

Ora, per fare in modo che siano considerati altri caratteri, ti basterà specificarli all'interno di questa classe.
Ad esempio, come hai chiesto:
Codice:
[a-z0-9@]
con questo sarà considerato anche il carattere @.
All'interno della classe puoi quindi aggiungere, in linea generale, i caratteri che desideri. Per alcuni caratteri speciali può essere necessario l'escape.

Inoltre, questa condizione può essere ottimizzata:
PHP:
((!isset($_POST['password'])) ||  ($_POST['password'] == "") || (!preg_match("/^[a-z0-9]+$/i", $_POST['password'])) || (strlen(trim($_POST['password']) > 10)))

Considerando il pattern appena visto, puoi notare il "+" specificato dopo la classe. Si tratta di un quantificatore. In questo caso indica che la classe di caratteri, che lo precede, può essere considerata da una a più volte. Cioè deve essere trovato almeno un carattere tra quelli della classe.
Questo significa che una stringa vuota, esaminata con tale espressione regolare, renderebbe comunque vera la condizione anche se non è presente il controllo precedente ($_POST['password'] == "")

Ti dirò di più, usando un quantificatore in maniera più opportuna è possibile eliminare anche il controllo successivo per il massimo numero di caratteri consentiti. Personalmente ti consiglierei di specificare anche un minimo.

Riepilogando, la condizione potrebbe essere scritta in questo modo:
PHP:
((!isset($_POST['password'])) ||  (!preg_match("/^[a-z0-9@]{6,10}$/i", $_POST['password'])))
Nota [a-z0-9@]{6,10} in cui è specificato che deve essere trovata una serie tra 6 e 10 caratteri, poi vedi tu come meglio adeguare il tutto secondo le tue esigenze.
 
@Borgo

grazie mille ma nn sono bravissimo, e quindi proverò a capire come aggiungere la funzione sha1 ma al momento nn so come potrei aggiungerla allo script

@otto9due

grazie mille anche a te, provo e ti so dire se funziona

@WmbertSea

grazie mille anche a te, soprattutto per avermi dato una spiegazione così completa da capire cose che mi erano pochi chiare, ad esempio
modificatore "i" che sta a significare "ignore case"
ignoravo cosa fosse e nn capivo neanche quando sono andato a vedere le classi, ora mi è molto più chiaro.

Proverò a mettere in pratica tutto e se ho problemi vi scrivo!!!
 
ciao
come usare sha1 te l'ho postato prima, quindi nel campo password della tabella users troverai non la pass in chiaro ma la pass criptata.
analogamente quando l'utente si logga, cioè inserisce la pass per accedere, dovrai criptare anche questa, sempre con sha1, e il confronto avverrà tra i due valori criptati
la criptatura impedisce (o almeno rende difficoltoso) che qualche maleintenzionato possa rubare le pass, cioè può anche riuscire a rubarle ma difficilmete riesce a capire quele sia l'originale.
dimenticavo: allunga il campo pass a varchar(250), così se decidi di criptare hai lo spazio necessario
 
Grazie borgo,
l'ho fatto era una cavolata ...

PHP:
<?php
// controllo sul parametro d'invio
if(isset($_POST['submit']) && (trim($_POST['submit']) == "Iscriviti"))
{ 
  // controllo sul formato dell'email
  if((!isset($_POST['email'])) || (!eregi("^([a-z0-9\._-]+)(@[a-z0-9.-]+)(\.{1}[a-z]{2,4})$", $_POST['email'])))
  {
    echo "Attenzione, formato email non valido.";
  }
  // controllo sul formato della password deve essere alfanumerica e non deve superare i dieci caratteri di lunghezza
  elseif((!isset($_POST['password'])) ||  ($_POST['password'] == "") || (!preg_match("/^[a-z0-9@]+$/i", $_POST['password'])) || (strlen(trim($_POST['password']) > 10)))
  {
    echo "La password deve essere alfanumerica e non più lunga di 10 caratteri.";
  }else{
    // se i parametri sono corretti popoliamo il database
    $email = $_POST['email'];
    $password = sha1($_POST['password']);

    // ma prima controlliamo che la mail non sia già presente includiamo il file di configurazione
    @include "config.php";

    $ctrl_mail = @mysql_query("SELECT id FROM users WHERE email='$email'") or die (mysql_error());
    if(@mysql_num_rows($ctrl_mail)>0)

però nn si può' fare, perché quando poi arriva la mail e ci clicco sopra per confermare la password e attivare il mio account nn so cosa mi ha creato come password, e se metto quella che ho scelto quando mi sono registrato nn funziona :(

scusa mi correggo lo so perché nella mail che arriva ci sono i dati di registrazione e quindi la password, ma nn è quella che ho deciso io :(
 
Ultima modifica:

Discussioni simili