begin process at 2012 05 27 20:35:47
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Formulaires

 > TESTEUR DE REGEX

TESTEUR DE REGEX


 Information sur la source

 Description

Dans le cadre des champs de formulaire, on contrôle la validité de l'entrée par une regex.

Sauf que pour un champ donné, disons l'adresse email par exemple, on trouve 3 milliards de regex sur le net, et bien sûr, pas deux identiques. Sans compter que ce sont souvent les débutants qui postent leur belle regex toute fraiche sortie de leur petits doigts fébriles tapotant sur son nouveau clavier bluetooth. (moi aussi j'ai des petits doigts fébriles -:)

Résultat: peu de regex trouvées sur le net fonctionnent vraiment ou correspondent exactement à votre besoin propre.

D'où ce tout petit script utilitaire uniquement pour vérifier les regex sur votre système ou  pour vous aider à comprendre les regex et autres pcre/posix.

Soit on tape la regex à tester dans le champ prévu à cet effet, soit on laisse le champ vide, et le test sera effectué sur le tableau de regex inclus dans le script. Bien sûr, il suffit d'en ajouter d'autres en fonction de ce que vous voulez tester.

Nota:
- A n'utiliser qu'en admin évidemment.
- C'est aussi largement améliorable en ajouter des preg_match_all, en vérifiant les retour etc..

PS: il y a quand même un site plutôt pas mal pour les regex, mais c'est surtout US donc pour les adresses, pas très utile...
http://regexlib.com/Default.aspx

Source

  • <?php
  • session_start();
  • error_reporting(E_ALL);
  • // QQ REGEX
  • $_SESSION['regex'] = array(
  • 'nom' => "#[a-zéèàêâùïüëA-Z][^0-9]#",
  • 'prenom' => "#[a-zéèàêâùïüëA-Z][^0-9]#",
  • 'raison_sociale'=> "#[a-zéèàêâùïüëA-Z][^0-9]#",
  • 'telephone' => "#^0[1-689]([-. ]?[0-9]{2}){4}$#",
  • 'email' => "#^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]{2,}\.[a-z]{2,4}$#",
  • 'siret' => "#[0-9]{14}#",
  • 'ape_naf' => "#[0-9]{5}#",
  • 'rue' => "#^[a-zA-Z0-9 ,-/éèàêâùïüë]{0,50}$#",
  • 'ville' => "#^[a-zA-Z1-9-/ éèàêâùïüë]{1,50}$#",
  • 'code_postal' => "#^[0-9]{2} ?[0-9]{3}$#",
  • 'date_naissance'=> "#^[0-3]?[0-9][/\- ][01][0-9][/\- ][0-9]{4}$#",
  • 'login' => "#^[a-zA-Z0-9_@]{4,20}$#",
  • 'pwd' => "#^[a-zA-Z0-9_@]{8,20}$#",
  • 'phrase_cle' => "#[a-zéèàêâùïüëA-Z]#",
  • 'ip' => '#^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$#',
  • 'test_ip1' => '#^(168|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$#'
  • );
  • // Testeur de regex
  • if (isset($_POST['reg']) && isset($_POST['val']) ) {
  • $value = htmlspecialchars($_POST['val']);
  • // teste d'une seule regex
  • if (!empty($_POST['reg'])) {
  • $regex = htmlspecialchars($_POST['reg']) ;
  • if ( preg_match( $regex, $value, $matches ) ) {
  • echo '<br/><b>Ok</b>: <u>'. $value . '</u> matche avec <u>' . $regex . '</u><br/>' ;
  • }
  • else{
  • echo '<br/><b>NOk : <u>'. $value . '</u> ne </b> matche <b>pas</b> avec <u>' . $regex . '</u><br/>' ;
  • }
  • }
  • // teste le tableau des regex
  • else {
  • $regex = $_SESSION['regex'];
  • foreach($regex as $reg_name => $reg) {
  • if ( preg_match( $reg, $value) ) {
  • echo '<br/>Match: La regex <b>' . $reg_name . '</b>(<u>'. $reg . '</u>) matche avec la valeur <u>' . $value .'</u>';
  • }
  • }
  • }
  • }
  • echo '<form method="post" action="/admin/test_regex.php">';
  • echo '<p>';
  • echo '<label for="reg">La regex </label><br/>';
  • if (is_array($regex)) {$aff='';} else { $aff=$regex;}
  • echo '<input type="text" id="reg" name="reg" size="100" value="'. $aff . '"/><br/>';
  • echo '<label for="ma_valeur">La valeur à tester </label><br/>';
  • echo '<input type="text" id="ma_valeur" name="val" size="100" value="'. $value. '"/>';
  • echo '</p>';
  • echo '<p>';
  • echo '<input type="submit" /> <input type="reset" />';
  • echo '</p>';
  • echo '</form>';
  • ?>
<?php
 
session_start();
error_reporting(E_ALL);

// QQ REGEX
	$_SESSION['regex'] = array(
	'nom'			=> "#[a-zéèàêâùïüëA-Z][^0-9]#",
	'prenom'		=> "#[a-zéèàêâùïüëA-Z][^0-9]#",
	'raison_sociale'=> "#[a-zéèàêâùïüëA-Z][^0-9]#",
	'telephone'		=> "#^0[1-689]([-. ]?[0-9]{2}){4}$#",
	'email'			=> "#^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]{2,}\.[a-z]{2,4}$#",
	'siret'			=> "#[0-9]{14}#",
	'ape_naf'		=> "#[0-9]{5}#",
	'rue'			=> "#^[a-zA-Z0-9 ,-/éèàêâùïüë]{0,50}$#",
	'ville'			=> "#^[a-zA-Z1-9-/ éèàêâùïüë]{1,50}$#",
	'code_postal'	=> "#^[0-9]{2} ?[0-9]{3}$#",
	'date_naissance'=> "#^[0-3]?[0-9][/\- ][01][0-9][/\- ][0-9]{4}$#",
	'login'			=> "#^[a-zA-Z0-9_@]{4,20}$#",
	'pwd'			=> "#^[a-zA-Z0-9_@]{8,20}$#",
	'phrase_cle'	=> "#[a-zéèàêâùïüëA-Z]#",
	'ip'			=> '#^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$#',
	'test_ip1'		=> '#^(168|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$#'
	
	);
	
// Testeur de regex

if (isset($_POST['reg']) && isset($_POST['val']) ) {
	$value = htmlspecialchars($_POST['val']);

	// teste d'une seule regex
	if (!empty($_POST['reg'])) {
		$regex = htmlspecialchars($_POST['reg']) ;
		if ( preg_match( $regex, $value, $matches ) ) {
			echo '<br/><b>Ok</b>: <u>'. $value . '</u> matche avec <u>' . $regex . '</u><br/>' ;
		}
		else{
			echo '<br/><b>NOk : <u>'. $value . '</u> ne </b> matche <b>pas</b> avec <u>' . $regex . '</u><br/>' ;
		}
	}
	// teste le tableau des regex
	else {
		$regex = $_SESSION['regex'];
		foreach($regex as $reg_name => $reg) {
			if ( preg_match( $reg, $value) ) {
				echo '<br/>Match: La regex <b>' . $reg_name . '</b>(<u>'. $reg . '</u>) matche avec la valeur <u>' . $value .'</u>';
			}
		}
	}
}


echo '<form method="post" action="/admin/test_regex.php">';
	echo '<p>';
		echo '<label for="reg">La regex </label><br/>';
		if (is_array($regex)) {$aff='';} else { $aff=$regex;}
		echo '<input type="text" id="reg" name="reg" size="100" value="'. $aff . '"/><br/>';
		echo '<label for="ma_valeur">La valeur à tester </label><br/>';
		echo '<input type="text" id="ma_valeur" name="val" size="100" value="'. $value. '"/>';
	echo '</p>';
	echo '<p>';
       echo '<input type="submit" /> <input type="reset" />';
   echo '</p>';

echo '</form>';

?>

 Conclusion

void


 Sources du même auteur

Source avec Zip [PHP5.2] CLASSE PDO
BARRES PARAMÉTRABLES EN DÉGRADÉ DE COULEUR ET AVEC TEXTE DA...

 Sources de la même categorie

Source avec Zip Source avec une capture VALIDATEUR DE FORMULAIRE par Reldan
Source avec Zip SUIVI SERVICE CLIENT PHP par hige52
Source avec Zip POO - FORMULAIRE NEWSLETTER PHP - PROFESSEUR-PHP.COM par mtrix000
Source avec Zip Source avec une capture SELECTEUR DE NOTE par Reldan
Source avec Zip Source avec une capture ESPACE MEMBRE , AVEC CASE OPTIONNEL , SANS MYSQL par sartoz

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture VALIDATEUR DE FORMULAIRE par Reldan
Source avec Zip VÉRIFICATION DE FORMULAIRE EN PHP par psonic13
FORMULAIRE BBCODE AVEC PASSAGE EN HTML par Seby63
CLASS DE CONTRÔLE DE FORMULAIRE par baxterio
Source avec Zip Source avec une capture FUNCTION CAPTCHA par waterw72

Commentaires et avis

Commentaire de neigedhiver le 08/01/2010 09:26:12

Salut,

C'est marrant ce passage : "Sauf que pour un champ donné, disons l'adresse email par exemple, on trouve 3 milliards de regex sur le net, et bien sûr, pas deux identiques. Sans compter que ce sont souvent les débutants qui postent leur belle regex"

Disons que ta regex pour l'adresse email est loin de valider une adresse conforme à la RFC 5322 ( http://en.wikipedia.org/wiki/E-mail_address#RFC_specification ). Je viens de trouver un article qui m'a l'air intéressant sur la question : http://www.iamcal.com/publish/articles/php/parsing_email/ et je ne pense pas que l'auteur soit débutant ;)
Bon, comme tu proposes tout un tas de regex, je suppose qu'on peut discuter de la validité de certaines ;)
Par exemple, pourquoi interdire les accents sur les lettres capitales ? L'Académie Française préconise l'utilisation de capitales accentuées, étant donné que les capitales non accentuées ne sont dûes qu'à une habitude en typographie qui n'est pas justifiée par autre chose que le nombre de caractères à utiliser. Pour les accents, tu en oublies quelques uns également, par exemple ñ ou õ (pour ne citer qu'eux)

Celle du mot de passe me pose un sérieux soucis de sécurité : le nombre de caractères est arbitrairement limité, sans réelle raison. Quand un caractère est hashé (md5, sha1 ou autre), il en résulte une chaîne de caractères hexadécimaux ne posant aucun problème de sécurité lors d'une requête sur la base de données. Personnellement, j'utilise habituellement un mot de passe contenant des caractères spéciaux tels que @ $ ! # & voire même £ ¤ µ et j'en passe. Il serait dommage de les interdire, sachant que leur utilisation ne cause aucun problème en matière de sécurité.

Ta regex pour les dates de naissances a un problème : le motif que tu utilises ( #^[0-3]?[0-9][/\- ][01][0-9][/\- ][0-9]{4}$# ) permet une date comme 39/18/9999
Pour l'année, admettons (même si on n'y est pas encore, mais dans ce cas, il n'y a pas de raison de forcer/limiter le nombre de caractères à 4, puisqu'on ne peut pas valider la date de naissance de Charlemagne). Pour le jour et le mois, c'est gênant ^^. Je pense qu'il faut, pour un motif valide, utiliser des assertions pour s'assurer que, pour le jour, le chiffre 3 n'est suivi que de 0 ou 1, et que pour le mois, le chiffre 1 n'est suivi que de 0, 1 ou 2. Et encore, ce ne serait pas suffisant, puisqu'il n'y a que 30 jours en avril, 28 ou 29 en février...

Enfin, je ne comprends pas pourquoi tu mets les regex en variable de session... Je n'en vois pas l'intérêt...

Sinon, ma référence en matière de test de regex, c'est lumadis.be : http://www.lumadis.be/regex/test_regex.php?lang=fr

Pour terminer, l'idée est bonne, très intéressante et peut s'avérer très utile pour du développement ou de la validation de données. Ca reste quand même un outil léger, parce que pour faire de la validation de données, le mieux est d'utiliser une classe plus sophistiquée permettant de faire des tests plus poussés (par exemple pour les dates !).

Commentaire de hornetbzz le 08/01/2010 12:31:58

Merci pour ces précisions et les commentaires.

Les regex incluses sont là uniquement à titre d'exemple. Il est clair que ce ne sont en aucun cas des références :-)  Désolé si j'ai laissé croire un truc pareil.

Pour les emails:
à nouveau, la regex jointe n'est qu'un exemple. N'oublions pas, c'est la section "débutant" et l'objectif avoué est de donner des exemples, car la complexité des regex est telle que c'est presque un vrai métier ;-) . Si je balance la mega regex http://www.iamcal.com/publish/articles/php/parsing_email, ça risque d'en perdre plus d'un(e). Mais merci, elle est super bien, ainsi que le reste de ce site d'ailleurs.

Pour les accents:
je ne savais pas que le tylde sur les voyelles existait en langue française, mais oui pour le reste, je suis complètement d'accord.

Regex des pwd:
100% d'accord avec toi sur l'utilisation des car spéciaux @$£ etc.. , je fais exactement la même chose. Même si la regex incluse ne correspond pas à cela. Par contre, la limitation du nombre de caractères, même si elle est redondante avec la dB, me parait nécessaire mais effectivement pas indispensable du fait des sha-1 (md5..). Et à vrai dire, le motif en exemple est utilisé pour des requêtes cURL envoyées sur des produits qui ne supportent pas les caractères spéciaux d'où cette version light.

Pour les dates:
D'accord avec ta remarque. Mais comme tu le soulignes, la regex complète n'est pas si simple à écrire. A vrai dire, j'ai passé qq heures à essayer d'en écrire "une vraie" sans succès dans le délai qui m'était imparti, d'où cette version light. Donc j'effectue des contrôles postérieurs et complémentaires à la regex (histoire de ne pas voir Charlemagne squatter ma dB). Mais si tu en as écrite ou trouver une aussi belle que celle des emails, welcome ;-)

Pour les $_SESSION:
Ce code n'est qu'un extrait d'autres codes dans lesquels j'utilise les sessions. Effectivement, en standalone, les $_SESSION n'ont pas d'utilité particulière et peuvent très bien être remplacées par un array classique.

Pour la classe dédiée:
Bien sûr que l'on voit bien que ces regex ne sont que des exemples. La preuve, un test basique montre que la plupart de ces regex en exemple répondent "true" pour un même champ en entrée. Donc avec un grand "OUI", ça serait super de bâtir une classe pour être complet. Il faut juste la trouver ou la créer... Toute proposition sérieuse sera la bienvenue :-)

Commentaire de Archima le 11/01/2010 08:35:15

Salut,
T'as classe peut être utile (en dehors du fait que tes regex soient valident ou non)
Mais il existe à partir de PHP5 des filtres qui sont très utile et fonctionnent très bien. Renseigne toi dessus ;-)

Commentaire de hornetbzz le 14/01/2010 17:12:23

Merci pour vos commentaires auxquels je réponds ou j'ajoute :

Les dates :
la regex avec des assertions conditionnelles étant un tantinet sport - voire impossible - à écrire, ne pas oublier la fonction native de php : checkdate() en complément de la regex.

Les filtres:
Oui, c'est vrai, les filtres sont très bien. Effectivement, l'extension filter est activée par défaut depuis PHP 5.2.0 mais avant cette version, pas d'extension filter qui tienne la mer. (sauf PECL). D'où ces regex : nombreux sont ceux qui n'ont pas PHP5 et encore moins PHP6.

Commentaire de Archima le 14/01/2010 18:39:26

Pas faux ;) Je ne contredit pas non plus l'intérêt de cette classe ^^

Commentaire de neigedhiver le 14/01/2010 20:30:19

[HS]
Y'a quand même un moment, faudra arrêter de proposer des sources PHP4, hein. Je dis pas ça pour toi, mais simplement, s'arrêter à considérer que tout le monde n'a pas PHP5...
Je rappelle quand même que PHP en est à sa version 5.3 depuis plus de 6 mois, et que PHP4 n'est plus développé depuis 2 ans ni supporté depuis 1an 1/2.
Même Free permet d'utiliser PHP5. Même Ubuntu est à PHP5.2.
Un jour, faudra arrêter de regarder en arrière et tourner la tête franchement en avant : c'est justement parce que trop de gens hésitent à passer à PHP5 que les hébergeur de tous poils ne font pas tous l'effort d'installer PHP5.
Et après, on se retrouve avec des codes obsolètes et monstrueux juste parce qu'on veut que ce soit compatible PHP4... Et pourquoi pas compatible PHP3 tant qu'on y est ?

Voilà, c'était histoire de râler un peu, histoire d'être fidèle à mon image (et puis je suis de mauvais poil à cause de mon pc, désolé de vous le faire subir).
[/HS]

Commentaire de hornetbzz le 15/01/2010 08:39:57

Ah bon, tu n'utilises plus les regex en PHP5/6 ? les fonctions preg_match ou preg_match_all n'existent plus elles non plus ? Donc tant que les regex vivront, ce mini-code sera compatible : rien n'empêche de l'utiliser en php5 ou php6. D'autant plus que la doc concernant Filter est plutôt light. Et pour Free, je crois de mémoire qu'il faut hacker pour forcer PHP5. Bon allez, keep cool, promis, je mettrais une belle classe POO en PHP5 la prochaine fois ;-)

Commentaire de neigedhiver le 15/01/2010 09:34:17

J'ai pourtant pris la peine de préciser que je ne disais pas ça pour toi ^^
Je ne faisais qu'un commentaire théorique, sur la discussion de fond au sujet des sources compatibles PHP4. Je n'allais pas plus loin. Je n'ai pas parlé de regex inutiilisé sous PHP5 ou autre...
Bref.

Chez Free, hyper compliqué, il faut un .htaccess à la racine du site avec comme contenu :
php 1

Je sais pas si c'est vraiment "hacker", d'autant que c'est dans la doc/faq de Free quelque part.

Sinon, la doc pour les filtres est peut-être light, autant que certaines classes de la SPL, mais l'utilisation des filtres est quand même quelque chose de relativement simple.

Et pas de soucis, je suis cool, hein ;)

Commentaire de inwebo le 20/01/2010 23:33:49

[HS]
Pour activer PHP5 chez free, il suffit de mettre comme extension de fichier '.php5'.
[/HS]

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Récupération de champ dans un formulaire [ par alainG ] J'ai créé un formulaire pour ajouter un enregistrement dans une table.&lt;html&gt;&lt;head&gt;&lt;meta http-equiv="Content-Type" content="text/html"; Champ de formulaire [ par luckys ] Bj à tous,J'ai créer un script dans lequel sont compris a la fois le formulaire et la récuperation des données pour les inclure dans une base.Je voudr formulaire + champ de type "File" [ par ironnyc ] Salut a tous!!j ai un petit prob avec mon formulaire pour faire un upload.Dans mon ficher "Formulaire.htm"j utilise un champ de type "File" (avec encr PHP: récupérer le champ d'un formulaire sans Bouton! [ par brahma ] hello ,avec php: comment puis je récupérer la valeur d'un champ d'un formulaire, lorsque l'utilisateur me donne la main en passant par un lien hyperte Modification de champ via un formulaire [ par Lephoenix75 ] Voial j'aimerai que lorsque je sélectionne un pseudo dans mon menu déroulant qu'il charge toute les infos concernant le pseudo (ou id) exemple =&gt; p Souci sur un champ texte. [ par Jouban ] Bonjour à tous !J?ai besoin de vos lumières pour m?éclairer sur un souci technique.Cela concerne des formulaires. J?ai un premier formulaire avec un c champ d'un formulaire suivant une selection radio [ par LiGrAnD ] Bonjour,je dois faire un formulaire recueillant des informations sur des personnes, mais les champs du formulaire doivent etre different celon la cate Affichage bulle d'erreur sur un champ de formulaire [ par ranouf ] Bonsoir tous,Pour s'inscrire dans le site que je crée il peut arriver que l'utilisateur face des erreurs.J'arrive a tous récupéré mais ce que je voudr pb avec un champ de type file [ par ouiskie ] Salut,j'ai un formulaire, et dedans il y a un chmap de type file, pour aller chercher l'adresse d'une image. Je v chercher l'adresse avec le bouton pa vérification de champ d'un formulaire [ par cobrachris ] j'ai lu plusieur post mais j'ai pas vraiment trouver.Voila je vous explique rapidement.J'aimerais cr&#233;er unformulaire pour enregistrer des lieux e


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,452 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales