Visualizzazione risultati 1 fino 5 di 5

Discussione: Controllo stringa con REGEX

  1. #1
    kairos2020 non è connesso Utente giovane
    Data registrazione
    16-04-2020
    Residenza
    Castegnato (BS)
    Messaggi
    47

    Predefinito Controllo stringa con REGEX

    Buongiorno,

    spero di essere nell'area giusta.
    Devo validare un codice che ricevo da un input :
    Codice HTML:
      <input type="text" value="<?php echo $colCod; ?>"  name="colCod" class="form-control "  maxlength="15"
    pattern="<?php echo $pattern; ?>" title="INSERISCI NEL FORMATO CORRETTO" required>
    Il pattern viene caricato dinamicamente perché è diverso a seconda del tipo di prodotto.
    In questo caso, il più semplice, é :
    Codice PHP:
    [A-Z]{3}[-]{1}[0-9]{2}[a-z]{0,1}
    Dovrebbe validare stringhe composte da tre caratteri alfabetici maiuscoli [A-Z]{3 } seguiti da un trattino alto [-]{1} seguito da 2 caratteri numerici [0-9] {2} tutto questo potrebbe essere seguito da
    un carattere alfabetico minuscolo [a-z]{0,1}.

    Il tutto ha funzionato per i primi giorni di test ora valida sia AAA-01 (corretto ) sia AAA-01f
    (ancora corretto) sia AAA-01F (non corretto).



    L'alternativa alle espressioni regolari per validare i codici sarebbe un script ad hoc per ogni tipologia
    di codice (7) ma uno scrip per validare un CODICE tipo AAA-01(f)(-V99)(-FE11) dove tra parentesi i pezzi di codice opzionali non ho idea di quante righe di codice richieda ...
    Mi hanno suggerito una libreria JS per validare l'input ma ho letto (non ricordo dove purtroppo) che questa potrebbe rendere poco sicuro il codice.

    Di sicuro la colpa è mia ma non capisco dove sbaglio se qualcuno ha qualche suggerimento ...

    Grazie

  2. #2
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,253

    Predefinito

    Le espressioni regolari mi sembrano lo strumento giusto in questo caso. Ma sia così che in JavaScript, dovresti sempre controllare i valori che arrivano lato server: il codice PHP deve effettuare lo stesso controllo, perché non ci si può mai fidare dei dati che arrivano. Usare la stessa espressione regolare in HTML ed in PHP è uno dei metodi migliori.

    Mi sembra strano che un codice simile smetta di funzionare all'improvviso, quindi è probabile che l'errore sia altrove. Nota anche che se l'espressione regolare è incorretta, viene ignorata silenziosamente. (Vedi: https://developer.mozilla.org/en-US/.../input#pattern) — Controlla magari il sorgente che arriva al browser, è tutto corretto?

    Un dettaglio: l'espressione sopra può essere scritta in modo più semplice. Un singolo carattere non ha bisogno di parentesi quadre, o di essere contato ([-]{1} -> -), per una cifra puoi usare \d, mentre {0,1} equivale a ?. Questo ti permette di scrivere espressioni più semplici, diminuendo il rischio di errori

    Codice:
    [A-Z]{3}[-]{1}[0-9]{2}[a-z]{0,1}
    diventa
    Codice:
    [A-Z]{3}-\d\d[a-z]?
    Ultima modifica di dreadnaut : 17-03-2023 alle ore 21.31.55

  3. #3
    kairos2020 non è connesso Utente giovane
    Data registrazione
    16-04-2020
    Residenza
    Castegnato (BS)
    Messaggi
    47

    Predefinito

    Buonasera, e grazie per la cortese risposta.

    Concordo, probabilmente il pattern non funzionava gìà prima, ho testato lo script di registrazione ma evidentemente non ho prestato la dovuta attenzione alla validazione del' input.

    Non credo che l'errore possa essere collegato all'input dell'utente, il pattern serve, dovrebbe servire, a validarlo
    quindi qualsiasi 'porcheria' digitata dovrebbe essere filtrata dal regex.
    Ho provato la tua regex e ... (naturalmente) funzione, partendo dal presupposto che la tua sia 'semplicemente' la
    versione compressa della mia ho provato anche la mia versione con il codice seguente :

    Codice PHP:
    if (!preg_match('/^[A-Z]{3}[-]{1}[0-9]{2}[a-z]{0,1}$/', $var)) {
    echo
    "NON VALIDO";
    } else {
    echo
    "VALIDO";
    }
    ... funziona anche la mia, non credo per magia più semplicemente perchè omettevo i caratteri di inizio e fine stringa /^ e $/.

    Per scrupolo sono andato su un sito tester per le regex e come prevedibile funziona anche perfettamente.

    Mi spiace averti fatto perdere tempo, spero comunque che qualcuno leggendo il POST eviti di ripetere i miei errori.
    Grazie

  4. #4
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,253

    Predefinito

    Nessun problema, né una perdita di tempo. Non ho avuto occasione di usare <input pattern="..." con le espressioni regolari, quindi è stata un'interessante lettura.

    Le barre ad inizio e fine espressione sono necessarie in PHP¹, ma l'attributo pattern="..." in HTML sembra funzionare in modo diverso:

    1) i delimitatori non sono necessari

    No forward slashes should be specified around the pattern text. — mozilla.org
    2) il pattern viene "ancorato" all'inizio ed alla fine della stringa in automatico

    Let anchoredPattern be the string ^(?:, followed by pattern, followed by )$. — whatwg.org
    Riassumento: in PHP serve /^[A-Z]{3}$/, in HTML dovrebbe bastare [A-Z]{3}.



    [1] I due caratteri non devono essere per forza /, ma solo essere identici. Io uso spesso #...#, in particolare quando scrivo regex per indirizzi web, che già contengono /.

  5. #5
    kairos2020 non è connesso Utente giovane
    Data registrazione
    16-04-2020
    Residenza
    Castegnato (BS)
    Messaggi
    47

    Predefinito

    Buongiorno, no il problema infatti era un'altro, passando il valore del pattern con una variabile stringa non controllavo correttamente il parametro di controllo (il valore di IF) e caricavo un pattern sbagliato.

    Il dramma non è l'errore in se stesso, ma che era stato il primo controllo che avevo fatto per ciroscrivere l'errore, troppo spesso sono costretto a tornare alle parole del prof. di fisica ... ' Mauro io posso insegnarti, ma che tu capisca ...'

    Ho letto con interesse quanto nei link, grazie ancora

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •