Regex validation formulaire - problème avec certains caractères [Résolu]

Signaler
Messages postés
194
Date d'inscription
mardi 24 avril 2012
Statut
Membre
Dernière intervention
8 février 2021
-
Messages postés
31506
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
26 février 2021
-
Bonjour,

J'utilise un traitement PHP plutôt que les
pattern
pour la validation d'un formulaire. J'aimerais que tous les caractères alphabétiques soient acceptés. Et ils le sont tous sauf 2. Le "ç" et le "ã". Et je ne sais pas pourquoi... J'ai pourtant bien fait attention à la rédaction du filtre.

Voici le traitement PHP qui se trouve avant la première balise
<!DOCTYPE html>
:
<?php
	/* On démarre une session pour sauvegarder les données du formulaire. */
	session_start();
	/* On sauvegarde les différents pattern de validation des champs du formulaire dans des variables. */
	$registration_firstName_pattern = '#[0-9\.,;:"\!\?<>\{\}\[\]\(\)/\|\\\_=\+\#£\$&§%@\* ]+#';
	$registration_lastName_pattern = '#[0-9\.,;:"\!\?<>\{\}\[\]\(\)/\|\\\_=\+\#£\$&§%@\* ]+#';
	/* Si le bouton a été activé par l'utilisateur,... */
	if (isset($_POST['registration_send'])) {
		/* ...on sauvegarde cette activation dans une variable de session,... */
		$_SESSION['registration_send'] = $_POST['registration_send'];
		/* ...on sauvegarde ensuite les éventuelles données renseignées par l'utilisateur dans des variables de session,... */
		$_SESSION['registration_firstName'] = $_POST['registration_firstName'];
		$_SESSION['registration_lastName'] = $_POST['registration_lastName'];
		/* ...on prépare dans une variable de session un message d'erreur à afficher à l'utilisateur si ce dernier a oublié de remplir un champs obligatoire,... */
		$_SESSION['required_error'] = '
			<p class="error">
				Vous avez oublié de remplir ce champs. Ce champs est obligatoire. Merci de bien vouloir le remplir.
			</p>
		';
		/* ...on prépare dans une variable de session un message d'erreur à afficher à l'utilisateur si les conditions de remplissage n'ont pas été respectées par ce dernier,... */
		$_SESSION['pattern_error'] = '
			<p class="error">
				Vous avez utilisé un ou plusieurs des caractères interdits ci-dessous en remplissant ce champs. Merci de bien vouloir remplir le champs en respectant les conditions ci-dessous.
			</p>
		';
		/* ...puis on effectue les différents contrôles sur les champs. */
		/*----------------------*/
		/*-- FIRST NAME FIELD --*/
		/*----------------------*/
		/* Si le champs « Prénom : » n'a pas été rempli par l'utilisateur,... */
		if (empty($_SESSION['registration_firstName'])) {
			/* ...on redirige ce dernier vers le champs. */
			header("Location: #registration_firstName");
			/* Arrêt. */
			exit();
		}
		/* Si le champs « Prénom : » a été rempli par l'utilisateur mais qu'il présente une ou plusieurs erreurs,... */
		if (!empty($_SESSION['registration_firstName']) AND preg_match($registration_firstName_pattern, $_SESSION['registration_firstName'])) {
			/* ...on redirige ce dernier vers le champs. */
			header("Location: #registration_firstName");
			/* Arrêt. */
			exit();
		}
		/* Si le champs « Prénom : » a été rempli par l'utilisateur et qu'il ne présente aucune erreur,... */
		if (!empty($_SESSION['registration_firstName'])) {
			/* ...on traite les données renseignées par ce dernier. */
			/* Si l'utilisateur a renseigné un prénom composé on sépare les différentes parties de cette composition,... */
			$parts = explode('-', $_SESSION['registration_firstName']);
			/* ...on compte le nombre de parties,... */
			$nbr = count($parts);
			/* ...on crée un index pour la boucle,... */
			$i_while = 1;
			/* ...on crée un index pour les différentes instructions de la boucle,... */
			$i = 0;
			/* ...on lance la boucle,... */
			while ($i_while <= $nbr) {
				/* On transforme tous les caractères de chaque partie en minuscules,... */
				$parts[$i] = strtolower($parts[$i]);
				/* ...on transforme le premier caractère de chaque partie en majuscule,... */
				$parts[$i] = ucfirst($parts[$i]);
				/* ...on récupère le premier caractère de chaque partie,... */
				$firstChars[$i] = mb_substr($parts[$i], 0, 1);
				/* ...on récupère le reste des caractères de chaque partie,... */
				$lastChars[$i] = mb_substr($parts[$i], 1);
				/* ...on traite les éventuels accents sur le premier caractère de chaque partie,... */
				$firstChars[$i] = strtr($firstChars[$i], 'àáâãäåæçèéêëìíîïñòóôõöœùúûüý', 'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÑÒÓÔÕÖŒÙÚÛÜÝ');
				/* ...on ré-assemble le premier caractère et le reste des caractères de chaque partie,... */
				$parts[$i] = $firstChars[$i].$lastChars[$i];
				/* ...on incrémente l'index de la boucle,... */
				$i_while++;
				/* ...puis on incrémente l'index des instructions de la boucle. */
				$i++;
			}
			/* ...puis on ré-assemble les différentes parties. */
			$_SESSION['registration_firstName'] = implode('-', $parts);
		}
	}
?>
<!DOCTYPE html>


Configuration: Windows / Firefox 72.0

2 réponses

Messages postés
487
Date d'inscription
mardi 1 juillet 2008
Statut
Membre
Dernière intervention
23 février 2021
109
Bonsoir,

Pourquoi la réponse faite a-t-elle été effacée ?
Messages postés
3747
Date d'inscription
lundi 16 juillet 2007
Statut
Contributeur sécurité
Dernière intervention
25 février 2021
1 363
Hello,

Lorsqu'un modérateur supprime un message, tu reçois habituellement le motif de suppression par mail. Tu y trouveras notamment le pseudo du modérateur, si tu souhaites le contacter directement.

Je vais tout de même essayer d'apporter un début de réponse. L'auteur a un souci de regex, et tu lui apportes une réponse qui n'a aucun rapport. Il est donc probable que ton message ait été supprimé pour le motif "Hors-sujet local".
Messages postés
487
Date d'inscription
mardi 1 juillet 2008
Statut
Membre
Dernière intervention
23 février 2021
109 >
Messages postés
3747
Date d'inscription
lundi 16 juillet 2007
Statut
Contributeur sécurité
Dernière intervention
25 février 2021

Bonjour,

Je comprends bien la raison que tu évoques mais je pense que ça n'est pas aider les gens que de les laisser "dans leur péché" (comme dirait ma belle-mère). Ils partent sur une "statégie" qui n'est pas la bonne. Ne rien leur dire et les laisser dans l'erreur en répondant à leurs questions qui les inciteront à poursuivre dans cette mauvaise voie n'est pas ce que j'appelle aider les gens.

Le problème était : un formulaire et un script PHP de traitement de ce formulaire : question sur un test de validation. La quasi totalité des tests de saisie étaient effectués en PHP (côté serveur). En cas d'erreurs multiples, le serveur renvoyait x fois des messages. Conséquences :
- ralentissement des vérifications (temps de transfert du client vers le serveur puis du serveur vers le client)
- trafic réseau inutile
- surchage du serveur qui se tape tous les tests.

Je lui disais que Javascript était fait pour ça : la vérification de formulaires. La vérification de la saisie se fait côté client (sur place et donc plus rapide), évite un trafic réseau qui n'a pas lieu d'être et évite au script (côté serveur) de se taper tous les tests (en ne faisant que ceux que javascript ne pouvait pas faire) et donc d'alourdir les scripts et de surcharger le serveur.

Alors, je suis d'accord avec toi, en lui disant ça, ça ne répondait pas directement à sa question mais ça lui donnait (enfin, il me semble) des éléments lui pemettant d'être plus efficace et de soulager ses scripts qui devaient être bourrés de tests.

- Voilà, je voudais faire la toiture sur la maison que je construis, comment dois-je m'y prendre ?
- Ben déjà, commence par tes fondations et monter tes murs
- Non, je veux commencer par la toiture...
- Mais... etc...

On ne peut pas le laisser se planter. Lui expliquer comment monter sa charpente au sol puis la garnir de tuiles avant de monter ses murs, c'est pas ce que j'appelle aider. Enfin, bref, ça me surprend et j'ai du mal à comprendre mais au moins tu m'as fourni, comme tu dis, un début de réponse car je n'ai eu aucun motif de suppression et je ne sais pas qui l'a supprimé. Mais bon...

Merci quand même.
Messages postés
15620
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
26 février 2021
666 >
Messages postés
487
Date d'inscription
mardi 1 juillet 2008
Statut
Membre
Dernière intervention
23 février 2021

Bonsoir

La majorité des suppressions faites par un modérateur sont issues d'un signalement.
Le premier modérateur disponible (faut pas oublier qu'ils sont bénévoles..) traite le signalement.
Il est tout à fait possible que le dit modérateur ne connaissent rien au sujet. Si la raison invoquée dans le signalement est "Hors sujet", il n'aurait pas de raison de ne pas y croire. Après tout celui qui signale n'est normalement pas venu par hasard sur ce sujet, il doit s'y connaitre.

J'ai refait un signalement, avec comme raison, que ton argumentaire mérite reflexion. Le modérateur qui le traitera pourra décider de te contacter, d'intervenir ici, de restaurer ton message tel quel, de le restaurer partiellement ou de ne rien faire.


Tu dis ne pas avoir reçu de message de suppression, il est peut-etre dans tes spams.
Dans la négative, tu as peut-être fait les frais d'un filtre de modération automatique un peu trop serré.
Messages postés
31506
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
26 février 2021
3 283 >
Messages postés
15620
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
26 février 2021

Bonjour Whismeril,
Je viens de voir ton signalement dans la conciergerie.. et .. non ... son argumentaire n'est pas réellement bon...

La question concerne une regex en php.

La vérification côté client n'est pas non plus la bonne solution...
Il ne faut pas oublier que le code étant exécuté ( et disponible) dans le navigateur, il est possible de contourner le fonctionnement prévu.

Alors oui, on peut faire une première vérification côté client .... mais il faudra, de toutes façons la faire côté serveur si on veut s'assurer de la fiabilité des données que l'on doit traiter.

Je précise également qu'on peut très bien faire toutes les vérifications côté serveur et ne retourner qu'une seule fois avec toutes les erreurs ( donc pas besoin de traiter les erreurs une par une .. )

D'ailleurs, YameFAZE n'a jamais indiqué qu'il ne faisait aucune vérification côté client... il demandait juste comment traiter le remplacement de ses caractères .. ( à la limite, tu aurais donné la regex en javascript... la question n'aurait peut-être pas été supprimée )
Donc si je reprends ton argumentaire :

- Voilà, je voudais faire la toiture sur la maison que je construis, comment dois-je m'y prendre ?
- Ben déjà, commence par tes fondations et monter tes murs

Ben non.. moi je ne m'occupe que de la toiture... les fondations et le reste sont fait par les maçons ...
Donc ma question est comment faire une toiture... et rien d'autre !
Messages postés
194
Date d'inscription
mardi 24 avril 2012
Statut
Membre
Dernière intervention
8 février 2021

Bon j'ai finalement résolu mon problème en le contournant. Plutôt que de faire
$registration_firstName_pattern = '#[0-9\.,;:"\!\?<>\{\}\[\]\(\)/\|\\\_=\+\#£\$&§%@\* ]+#';
, j'ai préféré faire ainsi
$registration_firstName_pattern = '#^-|-$|[-]+[-]+|\.+|,+|;+|:+|[\']+[\']+|"+|\!+|\?+|«+|»+|<+|>+|\{+|\}+|\[+|\]+|\(+|\)+|/+|\|+|\\\+|_+|=+|\++|\#+|£+|\$+|&+|§+|%+|@+|¤+|\*+|[0-9]+| +#';
, je marque en résolut. Merci tout de même.