Ciao, ci sono 4 o 5 cose che non vanno bene nella "strada che hai scritto".
1 - Intanto fai attenzione a come hai scritto il pattern:
codice:
/^[a-z A-Z 0-9 \. - _]+$/
c'è sicuramente qualche spazio di troppo o comunque inutile. Tieni sempre bene a mente che in una espressione regolare ogni singolo carattere ha una specifica rilevanza, per cui non puoi permetterti di inserire spazi random solo per rendere più leggibile il codice.
Inoltre non serve fare l'escape del punto dentro una classe di caratteri (il blocco tra parentesi quadre)
Se nella stringa non sono permessi gli spazi, il pattern va scritto così:
codice:
/^[a-zA-Z0-9_.-]+$/
Se invece sono permessi anche gli spazi, puoi scriverlo così:
codice:
/^[a-zA-Z0-9_. -]+$/
Inutile dire che questo, con tutti gli altri controlli del caso, dovrai farli anche lato server se tali dati vanno processati appunto lato server (come ha accennato Vincent.Zeno), dal momento che qualche malintenzionato può facilmente aggirare qualsiasi controllo lato client.
2 - Cosa pensi che significhi il punto esclamativo in questa condizione?
codice:
if(!re.test(str)){ alert('CARATTERI OK');
Si tratta di una negazione per cui, traducendo in umanese, significa "Se la stringa NON contiene solo i caratteri consentiti, allora è OK".
Puoi capire da te stesso che quella negazione è di troppo, anzi fa esattamente il contrario di ciò che ti serve.
Dovresti toglierla in questo modo:
codice:
if(re.test(str)){
alert('CARATTERI OK');
3 - La proprietà value di un campo di tipo file rappresenta il percorso del file selezionato, non solo il nome del file.
Quindi quel value ti restituisce una cosa del genere:
codice:
"C:\fakepath\nome_del_file.txt"
In realtà il suffisso, prima del nome del file, si tratta di un percorso fasullo per ragioni di sicurezza, ad ogni modo contiene sicuramente dei caratteri che non vuoi consentire.
Quindi, se devi controllare solo il nome del file (compresa l'estensione), partendo dal value dell'elemento input dovrai considerare in qualche modo solo la parte dopo l'ultimo slash, oppure (metodo che consiglio) usare la proprietà name dell'oggetto file contenuto nel FileList restituito da quell'input (come proprietà files).
Inoltre è necessario controllare la lunghezza del FileList per evitare possibili errori qualora non venga selezionato alcun file.
Più facile farlo che spiegarlo; la tua funzione potrebbe essere impostata in questo modo:
codice:
function valida() {
if (document.Modulo.campo_foto1.files.length === 0) return false;
const re = /^[a-zA-Z0-9_. -]+$/;
const str = document.Modulo.campo_foto1.files[0].name;
if (re.test(str)) {
alert('CARATTERI OK');
return true;
} else {
alert("CARATTERI SPECIALI NON AMMESSI. \n RIMUOVILI E RIPROVA.");
return false;
}
}
4 - Suppongo tu voglia poi eseguire il submit del form, ma penso ci sia qualche problema con quel button che hai impostato in quel modo. Per il momento dovrebbe apparire solo l'alert ma non ho capito se lo script che hai impostato è incompleto e vai quindi ad eseguire il submit in qualche altro modo.
Presumo ci sia da chiarire meglio anche questo aspetto. Nel caso ti consiglio di fare qualche ricerca del tipo javascript confirm form submit. e cercare di riportare scrupolosamente qualcuna tra le soluzioni trovate.
Fai sapere.