Problème avec une expression régulière

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Problème avec une expression régulière

Re: Problème avec une expression régulière

par Spols » 02 sept. 2010, 13:28

PHP 5 avancé, je sais plus quelle édition est la dernière, Il est très complet mais demande des connaissances préalables sinon c'est indigeste.

Re: Problème avec une expression régulière

par Lowlow » 02 sept. 2010, 10:28

Il ne fallait pas corriger ta fonction preg_match, ce n'est pas plus mal de gérer le début et la fin de ton expression dans ton preg_match.

Pour ton numéro GSM, je comprends pas chez moi cela fonctionne avec ton code

Quelle cas correspond à un numéro de téléphone ? Quelle format de numéro veut tu ?
Hum je crois que je devais être très fatiguée hier... car ça marche :)) en fait j'avais mal recopié ton expression régulière :)
Tout fonctionne :) c'est magique :)

Merci beaucoup pour ton aide =D>
Au fait as-tu par hasard des lectures à me conseiller pour améliorer mon php ?

Re: Problème avec une expression régulière

par Spols » 01 sept. 2010, 23:53

Il ne fallait pas corriger ta fonction preg_match, ce n'est pas plus mal de gérer le début et la fin de ton expression dans ton preg_match.

Pour ton numéro GSM, je comprends pas chez moi cela fonctionne avec ton code

Quelle cas correspond à un numéro de téléphone ? Quelle format de numéro veut tu ?

Re: Problème avec une expression régulière

par Lowlow » 01 sept. 2010, 23:20

Vraiment étrange, quand je change
if(preg_match("'^".$pattern."$'", $entry))
en
if(preg_match($pattern, $entry))
mon numéro de téléphone ne marche plus...
par contre dans les deux cas j'ai toujours une erreur sur le GSM...

j'avoue que j'ai dû mal à comprendre #-o

Re: Problème avec une expression régulière

par Lowlow » 01 sept. 2010, 22:56

Le probléme semble venir de ton fichier checkEntries.php. Le pattern que je t'ai donné était erroné (sorry), mais aussi, dans ta fonction preg_match, tu ajoute avant et aprés des caractères marquant le début et la fin de l'expression, il est donc inutile (et même problematique) de les mettre dans le switch.
voici ton expression régulière corrigée
$pattern = '(621|691|661){1}(([[:punct:][:blank:]]{0,1}[0-9]{2}){3}|([[:punct:][:blank:]]{0,1}[0-9]{3}){2})';
Merci pour ta réponse, par contre ça bloque encore... j'ai corrigé aussi ma fonction preg_match

mais j'ai remarqué que j'ai maintenant aussi une erreur quand je rentre le numéro de téléphone(téléphone et non GSM, j'ai les deux options) ... hum je vais voir ça de plus près... :roll:

Re: Problème avec une expression régulière

par Spols » 01 sept. 2010, 22:27

Le probléme semble venir de ton fichier checkEntries.php. Le pattern que je t'ai donné était erroné (sorry), mais aussi, dans ta fonction preg_match, tu ajoute avant et aprés des caractères marquant le début et la fin de l'expression, il est donc inutile (et même problematique) de les mettre dans le switch.
voici ton expression régulière corrigée
$pattern = '(621|691|661){1}(([[:punct:][:blank:]]{0,1}[0-9]{2}){3}|([[:punct:][:blank:]]{0,1}[0-9]{3}){2})';

Re: Problème avec une expression régulière

par Lowlow » 01 sept. 2010, 17:37

Donne nous ton code en entier, car quand j'ai essayé les numéros donné dans mon code de test, il me renvoie 1.

Il peut y avoir un problème à l'endroit de l'utilisation du pattern
hum un vrai casse tête... j'ai cherché en vain :'(
voilà une partie de mon code :
dans le formulaire : form.php
<?php

if(isset($_POST["valider"]))

{
	require 'checkEntries2.php';
	require 'sendMail1.php';
	//require 'm2.php';
	
	//  données obligatoires :
	$data["name"] = trim($_POST["name"]);
	$data["responsable"] = trim($_POST["responsable"]);
	$data["tel"] = checkEntries(trim($_POST["tel"]), "digit"); 	
	
	$data["gsm"] = checkEntries(trim($_POST["gsm"]), "gsmtest");
	if($_POST["nogsm"])
		$data["gsm"] = trim($_POST["nogsm"]);
	
	$data["mail"] = checkEntries(trim($_POST["mail"]), "mail");
	$data["adresse"] = trim($_POST["adresse"]);
	$data["condition"] = trim($_POST["condition"]);
	// données facultatives :

	$data_option["fax"] = trim($_POST["fax"]);

		
	$erreur = null;
	$erreurs = array('name' => 'dans le nom de l\'organisme demandeur', 
					'responsable' => 'dans le nom du représentant',
					'tel' => 'dans le numéro de téléphone',
					'gsm' => 'dans le numéro gsm',
				
					'mail' => 'dans l\'adresse mail',
				
					'adresse' => 'dans l\'adresse de facturation',

					'condition'=> 'il faut accepter les conditions d\'utilisation');
					
	
					
					
	echo "<p>";
	foreach($data as $key => $value)
	{
		if(empty($data[$key]))
		{
			$erreur = 1;
			echo "Il y a une erreur $erreurs[$key]<br />";
		}
	}
	
	
	
	
	echo "</p>";
	if($erreur != 0)
		echo "<p>Veuillez recommencer.</p>";
	else
	{
		if(sendMail("form3", $data, $data_option))
			echo "Votre demande a été transmise à nos services.Vous allez recevoir un email de confirmation. Vous pouvez fermer la fenêtre.";
		else
			echo "Erreur de transmission, veuillez recommencer.";
	}
	
	if (is_null($erreur)) {
	$mail = $_POST['mail'];

$destinataire = $mail;

$sujet = "Confirmation " ;



$entetes = "From: @";


$message = "bla bla bla ";


mail($destinataire, $sujet, $message, $entetes) ;
	
	}
	

	
}
?>
ensuite voici le code lié à la case GSM :
<p>
			<label for="form3Gsm">GSM :</label>
			<input name="gsm" type="text" id="form3Gsm" onfocus="MM_popupMsg('Merci d\'entrer un num&eacute;ro de GSM valide commen&ccedil;ant par :\r621, 661, 691\r\rCes donn&eacute;es resteront confidentielles et ne seront utilis&eacute;es que pour traiter votre demande.')" value = "<?php if(isset($_POST["gsm"])) echo htmlspecialchars($_POST["gsm"]) ?>" /> 
 
  *  
  <input name="nogsm" type="checkbox" id="nogsm" value="pas de gsm" <?php if (isset($_POST['nogsm'])) echo 'checked = "checked"'?>/>
  Pas de GSM
  </p>
Ensuite mon fichier checkEntries.php (avec la fonction gsmtest).
<?php

function checkEntries($entry, $type, $needed = 1)
{
	if($needed == 1)
	{
		if(empty($entry))
			return null;
	}
	switch($type)
	{
		case "digit" :
		{
			$pattern = "([[:blank:][:punct:][:digit:]])*";
			
			break;
		}
		case "alnum" :
		{
			$pattern = "([[:alnum:]])*";
			break;
		}
		case "alpha" :
		{
			$pattern = "([[:alpha:]])*";
			break;
		}
		case "lower" :
		{
			$pattern = "([[:lower:]])*";
			break;
		}
		case "upper" :
		{
			$pattern = "([[:upper:]])*";
			break;
		}
		case "alnum+" :
		{
			$pattern = "([-_.])*([[:alnum:]])*";
			break;
		}
		case "mail" :
		{
			$pattern = "[[:alnum:]]([-_.]?[[:alnum:]_?])*@[[:alnum:]]([-.]?[[:alnum:]])+\.([a-z]{2,6})";
			break;
		}
		
		
		case "gsmtest" :
		{
			$pattern = '/^(621|691|661){1}(([[:punct:][:blank:]]{0,1}[0-9]{2}){3}|([[:punct:][:blank:]]{0,1}[0-9]{3}){2})^$/';
			break;
		}
		


		default :
		{
			$pattern = $type;
		}
	}
	if(preg_match("'^".$pattern."$'", $entry))
		return $entry;
	else
	{
		if($needed == 1)
			return null;
		else
			return "Non renseigné";
	}
}
?>
Merci beaucoup pour ton aide, peut être que le pb vient des [] #-o

Re: Problème avec une expression régulière

par Spols » 31 août 2010, 10:40

Donne nous ton code en entier, car quand j'ai essayé les numéros donné dans mon code de test, il me renvoie 1.

Il peut y avoir un problème à l'endroit de l'utilisation du pattern

Re: Problème avec une expression régulière

par Lowlow » 31 août 2010, 09:41

l'emploi de ' ou de " ne devrais rien changer du tout, sous quelle format as tu essayer ton numéro de téléphone, ce qui est important, c'est les 3 premier chiffres et comment tu sépare, regroupe les suivants.

Donne nous la séquence de chiffres essayés en changeant les chiffres mais pas les espace et autre ponctuation.

le format donné n'accepte pas : (entre autre)
un 0 avant l'indicatif
un espace ou une ponctuation en fin de ligne
plus d'un espace/ponctuation entre des paires ou trio de chiffres
les chiffres seules

Donne nous un maximum d'exemple de format valide et non valide afin de pouvoir t'aider
Hello Spols,

Merci pour ton aide, par exemple j'ai testé :
621123456
621 123 456
621 12 34 56
mais cela ne marche pas alors que ce genre de format devrait fonctionner :| j'ai dû rater quelque chose :'(

au moins ce qui marche c'est que si je fais des 621621621621 comme avant, le formulaire retourne une erreur.

Re: Problème avec une expression régulière

par Spols » 29 août 2010, 23:07

l'emploi de ' ou de " ne devrais rien changer du tout, sous quelle format as tu essayer ton numéro de téléphone, ce qui est important, c'est les 3 premier chiffres et comment tu sépare, regroupe les suivants.

Donne nous la séquence de chiffres essayés en changeant les chiffres mais pas les espace et autre ponctuation.

le format donné n'accepte pas : (entre autre)
un 0 avant l'indicatif
un espace ou une ponctuation en fin de ligne
plus d'un espace/ponctuation entre des paires ou trio de chiffres
les chiffres seules

Donne nous un maximum d'exemple de format valide et non valide afin de pouvoir t'aider

Re: Problème avec une expression régulière

par stealth35 » 29 août 2010, 22:27

tu peux te servir de ce si pour tester tes expressions
http://gskinner.com/RegExr/

Re: Problème avec une expression régulière

par Lowlow » 29 août 2010, 21:47

je proposerais
$pattern = '/^(621|691|661){1}(([[:punct:][:blank:]]{0,1}[0-9]{2}){3}|([[:punct:][:blank:]]{0,1}[0-9]{3}){2})^$/';
code de test :
<?php
$pattern = '/^(621|691|661){1}(([[:punct:][:blank:]]{0,1}[0-9]{2}){3}|([[:punct:][:blank:]]{0,1}[0-9]{3}){2})$/';
echo $pattern.' <br>';
$test = array('621123456','621 123456','621 123 456','621 12 34 56','621.12.34.56','675123456','abcdefghr');
//renvoie true true true true true false false
foreach($test as $var)
{
	var_dump($var,preg_match($pattern,$var));echo '<br>';
}
?>
Tout d'abord, merci pour ton aide et pour tes explications, je comprends mieux.
Par contre il doit y avoir encore une petite erreur car quand je teste, mon formulaire me signale que mon numéro de GSM est faux... est-ce que cela peut venir des ' car dans le reste de mon code j'ai utilisé des " ?

Re: Problème avec une expression régulière

par Spols » 29 août 2010, 18:02

$pattern = "(^(621|691|661|)+([:blank:][:punct:][0-9]{2})+([:blank:][:punct:][0-9]{2})+([:blank:][:punct:][0-9]{2}))";
#-o
En premier lieu, l'indicatif doit être présent une et une seule fois ==> on le précise plutot que + (1 fois ou plus) ->{1} (une et une seule fois)
Ensuite le nombre de paire de 2, de 3 ou tout d'un coups est fixe pour un pays donné non ?
(Je suis belge donc je connais pas exactement le format visé)
j'ai cru comprendre 6 chiffres par paire de 2, 3 ou en un coups séparé par un espace ou de la ponctuation
En gros,
ok
621123456
621 123456
621 123 456
621 12 34 56
621.12.34.56
...
je proposerais
$pattern = '/^(621|691|661){1}(([[:punct:][:blank:]]{0,1}[0-9]{2}){3}|([[:punct:][:blank:]]{0,1}[0-9]{3}){2})$/';
code de test :
<?php
$pattern = '/^(621|691|661){1}(([[:punct:][:blank:]]{0,1}[0-9]{2}){3}|([[:punct:][:blank:]]{0,1}[0-9]{3}){2})$/';
echo $pattern.' <br>';
$test = array('621123456','621 123456','621 123 456','621 12 34 56','621.12.34.56','675123456','abcdefghr');
//renvoie true true true true true false false
foreach($test as $var)
{
	var_dump($var,preg_match($pattern,$var));echo '<br>';
}
?>

EDIT : 2ème balise PHP modifié pour corriger une faute qui s'y était glissé

Re: Problème avec une expression régulière

par Lowlow » 29 août 2010, 16:14

il faut essayer de comprendre comment se construit ton numéro de téléphone avant de se lancer dans les expressions régulières.
Une fois que tu as détaillés ça dans un français simple, l'expression régulière devient plus simple.

Commence donc par cette étape (obtenir une phrase du genre "un indicatif entre des valeurs connue, suivi de 4 fois une paire de chiffre. Une paire de chiffre peut commencer par une espace ou un point, suivi de 2 chiffres")
Mon numéro de tél doit commencer soit par 621 soit par 691 soit par 661 puis il est suivit de 6 chiffres (mais là c'est compliqué certaines personnes font de paires de 2 et d'autres de 3).
$pattern = "(^(621|691|661|)+[0-9]{6})";
mais le pb reste le même malgré le signe ^, si l'individu met que des 621 ça marche aussi...

pour les paires :
$pattern = "(^(621|691|661|)+([:blank:][:punct:][0-9]{2})+([:blank:][:punct:][0-9]{2})+([:blank:][:punct:][0-9]{2}))";
#-o

Re: Problème avec une expression régulière

par zeus » 28 août 2010, 11:36

il faut essayer de comprendre comment se construit ton numéro de téléphone avant de se lancer dans les expressions régulières.
Une fois que tu as détaillés ça dans un français simple, l'expression régulière devient plus simple.

Commence donc par cette étape (obtenir une phrase du genre "un indicatif entre des valeurs connue, suivi de 4 fois une paire de chiffre. Une paire de chiffre peut commencer par une espace ou un point, suivi de 2 chiffres")