problema con la funzione preg_match
problema con la funzione preg_match postato il 04/07/2015 21:12:32 nel forum programmazione, open source e hosting
Salve a tutti.
Come da titolo ho un problema con la funzione preg_match() di php.
Nella pagina di registrazione di un sito che sto creando voglio impedire agli utenti di iscriversi usando caratteri accentati, spazi e caratteri speciali. Voglio cioè consentire agli utenti di avere esclusivamente account con caratteri alfanumerici.
Una volta inserito il nome dell'account nell'input text sottostante
<input type="text" name="nome"><br>
...
<input type="submit" name="invia" value="invia">
e premuto il submit, chiedo al codice di controllare che non vi siano i caratteri indesiderati. Il codice che utilizzo è il seguente:
if(preg_match("/[a-zA-Z0-9]+/si", $_POST['nome'])){
/** codice per la registrazione **/
}else{
echo 'non valido';
}
Nonostante la presenta del prag_match() nell'if() mi registra account con qualsiasi carattere, anche lettere accentate, spazi e caratteri speciali, mentre io vorrei che registrasse solamente account che presentano esclusivamente lettere (maiuscole o minuscole) e numeri.
Per quale motivo non funziona? Dove sbaglio?
Grazie
Pagine → 1
04/07/2015 21:17:12 e modificato da dyrr il 04/07/2015 21:20:17
preg_match($criterio , $testo , $matches);
questa è la sintassi della funzione, devi fare il controllo sull'array $matches non sulla funzione.
Fonte http://php.net/manual/it/function.preg-match.php http://php.net/manual/it/function.preg-match.php ↗
Nel senso puoi farlo anche sulla funzione direttamente ma di solito è meglio verificare l'array per capire se la regex funziona
Dopo controllo la regex perchè sono sempre stato negato nel controllarle al volo
04/07/2015 21:25:01
Al posto di $criterio devo sostituire "/[a-zA-Z0-9]+/si"
Al posto di $testo devo sostituire il testo in cui effettuare il controllo, ossia $_POST['nome'], poiché deve fare il controllo sul nome inserito dall'utente
Ma al posto di $matches cosa devo sostituire? Onestamente non l'ho capito.
04/07/2015 21:38:37 e modificato da dyrr il 04/07/2015 21:41:27
$matches, resta quello, ti serve per verificare cosa rileva preg_match con un print_r($matches) dopo la regex.
Comunque è sbagliata quella regex secondo me perchè da esito positivo sia che tu analizzi per esempio:
Davide che Davidè
mentre a te serve che il secondo caso non sia valido.
Potresti provare ad usare questa:
#([^a-zA-Z0-9]+?)#si
contando che rispetto a quella è invertita ovvero ti rileva come positive tutte le parole dove c'è almeno una lettera accentata
Il test della seconda regex è qui:
https://regex101.com/r/sO2uQ2/1 https://regex101.com/r/sO2uQ2/1 ↗
Quello della prima qui
https://regex101.com/r/eQ8lE5/1 https://regex101.com/r/eQ8lE5/1 ↗
04/07/2015 21:45:08 e modificato da astro991 il 04/07/2015 21:46:53
Ho capito, grazie mille per l'aiuto. Seguendo il tuo suggerimento sono riuscito nel mio intento utilizzando questo:
"/^[A-Za-z0-9]+$/si"
Ora mi rileggo con calma la guida che mi hai dato. Pensavo di aver capito come funzionasse ma pare di no. Quella cosa del $matches non l'avevo capita, grazie a te ora è più chiara. Grazie mille.
Non conoscevo quel sito regex101.com, ora lo utilizzo per controllare se funzionano o meno i miei codici. grazie.
Discussione seguita da
Pagine → 1
Rispondi alla Discussione Segui Discussione Inoltra Discussione Forum Programmazione, Open Source e Hosting Elenco Forum
Articoli, Interviste e altre Risorse!
Raja Dunia ↗
New Orleans ↗
Sea of Conquest ↗
RAID Shadow Legends ↗
Hero Wars ↗