Regex validation formulaire - problème avec certains caractères

Résolu/Fermé
YameFAZE Messages postés 201 Date d'inscription mardi 24 avril 2012 Statut Membre Dernière intervention 14 mars 2021 - 24 janv. 2021 à 19:49
jordane45 Messages postés 38288 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 15 novembre 2024 - 10 févr. 2021 à 21:36
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

heliconius Messages postés 539 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 139
26 janv. 2021 à 01:05
Bonsoir,

Pourquoi la réponse faite a-t-elle été effacée ?
0
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".
0
heliconius Messages postés 539 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 139 > Utilisateur anonyme
10 févr. 2021 à 20:04
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.
0
Utilisateur anonyme > heliconius Messages postés 539 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023
10 févr. 2021 à 21:26
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é.
0
jordane45 Messages postés 38288 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 15 novembre 2024 4 703 > Utilisateur anonyme
Modifié le 14 févr. 2021 à 23:39
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 !
0
YameFAZE Messages postés 201 Date d'inscription mardi 24 avril 2012 Statut Membre Dernière intervention 14 mars 2021
30 janv. 2021 à 11:21
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.
0