Traduction par Jean-luc Biord, du Site de la communauté Qt francophone.
English TOC.

10. Validation d'Entrée

Validation en utilisant des expressions régulières

Tout logiciel d'ordinateur a besoin d'entrée appropriée pour pouvoir produire une sortie appropriée. C'est pourquoi nous devons vérifier toutes les entrées des sources non sûres (telles que les utilisateurs, tout autre logiciel, les fichiers d'entrée, etc.). Ce processus s'appelle la validation d'entrée.

Il y a encore une autre raison : la sécurité. Beaucoup de systèmes aujourd'hui supportent les scripts et, par exemple, utilisent les saisies de l'utilisateur comme requêtes SQL sur les bases de données centrales. Ici, il est important de protéger le système contre des injections de scripts et autres.

Comment l'entrée peut-elle être validée ? Certaines choses sont faciles comme les nombres qui comprennent les caractères 0 à 9 et peut-être +, -,., e ou E si nous souhaitons permettre la notation scientifique et les valeurs réelles. Il est plus difficile de vérifier d'autres choses comme des adresses de mél., URL, etc., mais il y a toujours un modèle, bien qu'il soit complexe. En traitant le langage humain, ces modèles sont tellement variés et complexes qu'ils ne peuvent pas être exprimés comme programme informatique - essayez seulement un contrôle de grammaire d'un traitement de texte pour voir à quel point c'est stupide. Dans ces cas, nous pouvons au moins essayer certaines validations comme s'assurer que les données ne contiennent aucun caractère illégal.

Tous ces cas peuvent être traités en utilisant des expressions régulières, ou des expressions régulières courtes. En écrivant une ER, vous écrivez le modèle pour valider l'entrée.

Avant que je rentre plus en avant dans le sujet il y a des choses dont je dois parler. D'abord, il y a plusieurs dialectes ER, ils travaillent tous à peu près dans le même sens, mais quelques détails peuvent différer. Ce chapitre travaille avec l'implémentation de Qt. En second lieu, les ER peuvent être employées dans beaucoup de contextes, par exemple en divisant l'entrée en morceaux plus simples. Ce chapitre traite seulement la validation d'entrée. Troisièmement, et pour finir, ce chapitre couvrira uniquement la partie simple du sujet. Pour plus d'information, regardez les liens de lecture recommandés à la fin de ce chapitre.

La documentation officielle de Qt sur les expressions régulières est énorme et bonne. J'essayerai de fournir une introduction douce, mais laisse les détails à la documentation officielle.

La plus simple ER possible est juste un caractère, par exemple A. Cette ER validera n'importe quelle chaîne contenant A. A n'a pas besoin d'être à une position particulière dans la chaîne, il peut y avoir plus d'un A, mais il doit y avoir au moins un A.

Alors qu'un caractère simple d'ER est plutôt limité, nous pouvons assortir plus de caractères. Pour permettre plus de caractères, mettez simplement un groupe d'entre eux entre crochets. L'ER [ABC] validera n'importe quelle chaîne contenant A, B ou C. Comme avec le cas d'un simple caractère, seulement un est nécessaire et il peut y en avoir plus d'un. Afin d'éviter de devoir écrire l'alphabet entier pour permettre toutes les lettres, ou [0123456789] pour permettre tous les nombres, et quelques autres, des caractères spéciaux d'étendue peuvent être mis comme [A-Z] (lettre majuscule), [a-z] (lettres minuscules) et [0-9] (nombre).

Il y a trois points plus importants à comprendre pour pouvoir employer les ER pour traiter la plupart des cas d'entrée.

D'abord, en mettant beaucoup de caractères simples ou caractères groupés ensemble, nous forçons une correspondance dans cet ordre. Par exemple  [ABC][123]a valide A1a, xB3a, yvC1ax mais pas x1Aay, ya1A ni a. mail valide mailbox, junk mail, email, etc.

Deuxièmement, nous pouvons valider le début d'une chaîne avec ^ et la fin avec $. Ceci signifie que ^[ABC][123]$ valide seulement A1, A2, A3, B1, B2, B3, C1, C2 et C3. Car nous validons le début et la fin de la chaîne, rien d'autre n'est permis avant ou après l'ER.

Troisièmement, nous pouvons contrôler le nombre d'apparitions que nous permettons pour chaque caractère ou groupe de caractères {limite-basse, limite-haute}. Ainsi [A-Z]{0,15} valide jusqu'à 15 lettres majuscules, [0-9]{1,3} toutes les valeurs entre 0 et 999.

Au lieu de mettre {limite-basse, limite-haute}, il est possible d'employer la version {compte-exact} ou d'omettre la limite inférieure ou supérieure (et la faire ainsi ignorer par QRegExp). Il est également possible d'écrire, par exemple, [0-9]+. Cela valide un ou plusieurs chiffres. [0-9]* valide zéro chiffre ou plus tandis que [0-9]? valide zéro ou un chiffre.

En mettant un ^ comme premier caractère à l'intérieur d'un groupe de caractères nous inversons l'effet. Par exemple [^0-9]$ s'assure que le dernier caractère de la chaîne n'est pas un chiffre.

Il y a deux caractères plus délicats à utiliser. D'abord, le tiret, "-", doit être dernier dans un groupe autrement il sera interprété comme groupe de caractères (comme a-z). Puis il y a l'espace, " ", il doit être à la fin d'un groupe (mais avant tout tiret).

Essayons de développer un nouveau modèle pour valider un numéro de série. Le nombre est formaté comme ceci : un caractère simple W, S ou G indique le numéro de série de produit (poste de travail, serveur ou console de jeu), un numéro de quatre chiffres suit, puis un slash et un nombre à deux chiffres suivis d'un tiret et d'un nombre. W1003/01-26, S2055/99-2 et G9900/03-801 sont des exemples valides. Ainsi, d'abord nous validons le début de la chaîne en utilisant le signe ^, puis le W, S ou G utilisant [WSG]. Le numéro à quatre chiffres est facile : [0-9]{4}, ainsi que le slash (notez qu'un antislash est un caractère spécial, regardez la documentation officielle pour les détails). Le nombre et le tiret à deux chiffres sont également faciles [0-9]{2}-. Le dernier nombre est contrôlé avec [0-9]+. Puis, nous validons simplement la fin de l'entrée en utilisant $. L'ER finale est ^[SWG][0-9]{4}/[0-9]{2}-[0-9]+$.

Le RegExpExperiment

Pour rendre facile le développement et le test d'ER, ce chapitre propose une application simpliste d'évaluation d'ER appelée RegExp Experiment. La conception et l'implémentation sont décrites ci-dessous.

L'application se composera d'un dialogue avec deux lignes d'édition, une pour contrôler que le texte convienne et une pour l'ER. Le résultat sera montré et il y aura deux boutons : check et close. Alors, allons-y.

D'abord, créez un nouveau répertoire puis dans celui-ci, un nouveau projet Qt Designer.

Ajoutez un dialogue au nouveau projet et mettez dedans 2 boutons poussoir, 2 lignes d'édition, 4 labels et 2 spacers comme représenté sur le schéma 10-1. La figure montre également les dispositions. La partie du haut avec 2 par 3 widgets est mise dans une disposition de grille. Les boutons et le spacer horizontaux sont mis dans une disposition horizontale. Finalement, le reste est mis dans une disposition verticale.

The Widgets and the Layout

Schéma 10-1 Les Widgets et la Disposition.

Maintenant, changez les propriétés caption selon le schéma 10-2. Nommez la ligne d'édition supérieure leText et l'autre ligne d'édition leRE. Le bouton à l'extrême gauche s'appelle bCheck et celui à l'extrême droite bClose. Le label au-dessous de la ligne d'édition doit s'appeler lResult. En plus, appelez le dialogue fRegExpExperiment et modifier sa propriété caption pour RegExp Experiment. Sauver le comme fregexpexperiment.ui

The Captions

Schéma 10-2 Les noms.

Maintenant double-cliquez sur la forme pour créer fregexpexperiment.ui.h. Ajouter deux slots protégés: init() et check() (en employant l'explorateur d'objet). Raccorder les connexions signal-slot comme représenté sur le schéma 10-3.

The Connections

Schéma 10-3 Les Connexions.

L'exemple 10-1 montre l'implémentation des deux slots. init() initialise lResult pour ne pas montrer n'importe quel texte étrange tandis que check() utilise un QRegExp pour essayer de valider l'ER sur le texte. Veillez à inclure <qregexp.h> dans l'implémentation du dialogue (en employant l'explorateur d'objet).

void fRegExpExperiment::init()
{
  lResult->setText( "n/a" );
}

void fRegExpExperiment::check()
{
  QRegExp re( leRE->text() );

  lResult->setText( QString::number( re.search( leText->text() ) ) );
}

Exemple 10-1

La méthode QRegExp::search( ... ) renverra le premier endroit où l'ER est validée, ou -1 si l'ER ne peut pas être validée. When matching against the beginning of the string the value must be 0 or -1, otherwise it may be >=0 it matched.

Pour compléter le projet, ajoutez un fichier source C++ et implémentez un main() classique montré dans l'exemple 10-2.

#include <qapplication.h>

#include "fregexpexperiment.h"

int main( int argc, char **argv )
{
  QApplication a( argc, argv );

  fRegExpExperiment *m = new fRegExpExperiment();
  a.setMainWidget( m );
  m->show();

  return a.exec();
}

Exemple 10-2

Finalement, lancez qmake && make à partir du prompt et cela devrait fonctionner. Expérimentez maintenant avec l'ER décrite dans la première section de ce chapitre.

Validation d'entrée utilisateur avec QValidator

Maintenant nous savons comment valider des expressions régulières et les concevoir. Maintenant nous devons l'appliquer au grand projet Qt. C'est fait en utilisant les classes héritées de QValidator telles que QRegExpValidator et QDoubleValidator.

Un validateur peut être assigné aux lignes éditées, aux boîtes combo, aux spin box, etc... Une fois assigné, il valide l'entrée et la classifie comme valide, acceptable ou invalide. Si l'entrée est invalide, l'utilisateur doit la corriger avant de pouvoir sortir du widget. Si elle est acceptable, l'utilisateur peut la corriger ou le Validateur essayera si l'utilisateur quitte le widget. Aucune action n'est nécessaire pour des données valides. L'exemple 10-3 montre comment assigner nos ER de numéro de série à une ligne d'édition en utilisant QRegExpValidator.

QRegExp re( "^[SWG][0-9]{4}/[0-9]{2}-[0-9]+$" );
QRegExpValidator *validator = new QRegExpValidator( re, 0 );

QLineEdit *leSN = new QLineEdit( parent );
leSN->setValidator( validator );

Exemple 10-3

Le QIntValidator et le QDoubleValidator sont disponibles pour vérifier que l'entrée est un nombre valide et qu'il est à l'intérieur d'une étendue donnée. Si vous ne pouvez valider votre entrée en utilisant un descendant de QValidator il est très facile d'en hériter. Ceci est décrit en détail dans la documentation officielle pour QValidator.

Il y a un plus de détail. En utilisant setText pour changer le texte de, par exemple, une ligne éditable, le Validateur n'est pas employée. Une telle entrée doit être validée manuellement pour s'assurer de son exactitude.

Résumé

Le code d'exemple de ce chapitre peut-être trouvé ici.

Lecture Recommendée

This is a part of digitalfanatics.org and is valid XHTML.