Problème avec une Regex

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 Regex

Re: Problème avec une Regex

par sirakawa » 09 mars 2012, 19:01

Dans la mesure, où ton expression comporte deux parties dont l'une, commençant au point d'interrogation, contient elle-même un nombre imprévisible de sous-parties commençant par &, il est vraisemblable que la regex soit d'une forme:
((recherche et extraction de la partie commençant par ? (recherche de la partie commençant par ? et finissant par #)( recherche et extraction des parties commençant par #)))
ce n'est pas forcément plus simple que l'appel des fonctions de PHP prévues pour ça. C'est une grossière illusion de croire que, parce ton expression ne pend qu'une ligne, elle est plus rapide que plusieurs lignes; entre autres, sur ce point précis, parce que la solution regex va appeler le moteur regex de PHP, qui va devoir interpréter ton expression, quand les solutions PHP sont déja rédigées et compilées, et, je pense, optimisées.
extrait du manuel sur preg_split:
"Si vous n'avez pas besoin de la puissance des expressions régulières, vous pouvez choisir des alternatives plus rapides (quoique plus simples) comme explode() ou str_split(). "
____
Comme je suis la reine des poires, voici un début assez prometteur:
$val = "http://toyo.com?page=3798&sujet='lotion capillaire'&prix='712€'";
$vals = preg_split ('/\?/', $val, -1);
print_r ($vals);
La suite, évidente, ne devrait poser aucun problème à un regexmaniaque

Re: Problème avec une Regex

par Calimero » 09 mars 2012, 18:46

Hello,

Je ne vois pas en quoi j'ai manqué de respect à ploupy à qui j'ai répondu à chaque fois, et que j'ai remercié de prendre le temps de m'aider.

Comme expliqué plus haut, j'ai déjà fait le test avec parse_url(); , ce qui me renvoie exactement la même chose que ce que j'ai stocké avec $_SERVER['REQUEST_URI'];

Quand au jeu de test, c'est bien celui que j'ai fourni : la première variable est toujours 'page', et elle peut être suivie d'aucune, 1, 2 ou plusieurs autres variables.

Bon enfin c'est pas dramatique tout ça hein, ya plus grave :wink:

Merci à vous deux.
De courtoisie seulement, pas de respect. ploupy (dont je salue ici la persévérance) a donné plus de code que toi, ce qui est sympa de sa part et un peu paradoxal aussi. C'est juste que sa dernière suggestion était bonne (et originale) et méritait peut être un peu + de recherche de ta part ;) (Et si ton test, dont nous ne savons rien, ne donnait pas satisfaction ça aurait été bien de montrer le code du test par exemple qu'on puisse éventuellement rectifier, tester, débattre...). C'est pour cela que j'ai apporté mon crédit à son idée en t'expliquant pourquoi tu devrais y regarder une deuxième fois selon moi, ce qui t'a été montré d'une autre manière par sirakawa depuis.

La précision et l'efficacité d'une regexp dépendent beaucoup de la manière dont sont exprimées les contraintes (ce qui aide d'ailleurs à son écriture), et aussi l'exhaustivité du jeu de données de test (sinon il faut s'y reprendre à plusieurs fois, par essai et erreurs successives, et sur un forum ça peut être lourd), deux points sur lesquels ton post était plutôt vague. C'est sans doute à cause de cela que tu ne t'en es pas sorti tout seul. parse_str() te soulage de ce problème à bon compte, c'est pas si mal non ? ;)

EDIT:
Je suis sûr que c'est possible avec une simple ligne en regex, mais bon...
Ça l'est, je te le confirme, mais pour éviter des aller/retours il faudrait définir plus précisément les différents cas à traiter pour que le motif les prenne bien en compte. Ma dernière question (page toujours au début ou pas ?) allait dans ce sens, on peut toujours poursuivre dans cette direction tous les deux si tu le souhaites :)


@+ :)

Re: Problème avec une Regex

par CyberTaf » 09 mars 2012, 15:00

Bon et bien je vais me débrouiller avec tout ça alors.
Je suis sûr que c'est possible avec une simple ligne en regex, mais bon...
Merci à vous tous en tout cas.

Re: Problème avec une Regex

par sirakawa » 09 mars 2012, 14:25

Les interventions successives m'ont suggéré une solution plus simple que celle que j'utilisais à un problème du même genre:
1) parse_url fait parfaitement l'affaire, si on prend la peine de lire la doc et d'essayer les constantes répertoriées sous COMPONENT.
2) parse_str fait le reste.
<?PHP
$chaine = "http://www.dingo.zn/index.html?truc='machin'&chose=1&bidule='lalala'";
$query = parse_url($chaine, PHP_URL_QUERY);
$t_query = explode("&", $query);
/* ma méthode archéologique */
$t_final = array();
foreach ($t_query as $var)
{
	$t_variable = explode("=", $var);
	$nom = $t_variable[0];
	$val = $t_variable[1];
	$t_final[$nom] = $val;
}
print "avec la boucle";
print_r($t_final);
print "<hr> avec parse_str et deuxième paramètre";
parse_str($query, $tableau);
print_r($tableau);
print "la variable truc n'existe pas";
print "<hr> avec parse_str sans deuxième paramètre ";
parse_str($query);
print "la variable truc vaut $truc";
?>
et merci à ceux qui m'ont donné l'idée d'y replonger mon nez...

Re: Problème avec une Regex

par CyberTaf » 09 mars 2012, 14:19

Hello,

Je ne vois pas en quoi j'ai manqué de respect à ploupy à qui j'ai répondu à chaque fois, et que j'ai remercié de prendre le temps de m'aider.

Comme expliqué plus haut, j'ai déjà fait le test avec parse_url(); , ce qui me renvoie exactement la même chose que ce que j'ai stocké avec $_SERVER['REQUEST_URI'];

Quand au jeu de test, c'est bien celui que j'ai fourni : la première variable est toujours 'page', et elle peut être suivie d'aucune, 1, 2 ou plusieurs autres variables.

Bon enfin c'est pas dramatique tout ça hein, ya plus grave :wink:

Merci à vous deux.

Re: Problème avec une Regex

par Calimero » 09 mars 2012, 13:36

Hello,

En fait il serait bon que tu expliques en quoi la dernière suggestion de ploupy ne convient pas : c'est peut-être pas une regexp, mais ça a l'air de faire tout le travail de parsing que tu désires mieux qu'une regexp, donc je vois pas trop... C'est aussi par courtoisie par rapport à lui qui a pris le temps de s'intéresser à ton problème et de te faire des propositions.

Si vraiment ça ne va pas, on verra pour ta regexp si tu fournis un vrai jeu de test (Celui que tu as donné plus haut semble trop parfait : la variable est toujours la première, on ne sait pas si la chaîne est complète, etc...).

Re: Problème avec une Regex

par CyberTaf » 08 mars 2012, 23:20

Je fais un petit up au cas où une bonne âme experte en regex passerait par là :roll:

Re: Problème avec une Regex

par CyberTaf » 08 mars 2012, 00:27

parse_url() serait plus approprié dans ce cas-là :wink:
Mais ça ne m'avance pas car ça renvoie les même valeur de variables que $_SERVER['REQUEST_URI']

Merci d'essayer de maider :)

Re: Problème avec une Regex

par ploupy » 08 mars 2012, 00:21

void parse_str ( $url [, array &$arr ] );

exemple :
<?php
$str = "first=value&arr[]=foo+bar&arr[]=baz";
parse_str($str);
echo $first;  // value
echo $arr[0]; // foo bar
echo $arr[1]; // baz

parse_str($str, $output);
echo $output['first'];  // value
echo $output['arr'][0]; // foo bar
echo $output['arr'][1]; // baz

?>
ça à l'air sympas cette fonction, ca te retrouve toutes les variables de ta chaine et ca te les recrres automatiquement,
je sais pas si l'ecriture est bonne mais bon à tester !!

Re: Problème avec une Regex

par CyberTaf » 08 mars 2012, 00:06

Je crois que tu n'a pas compris ce que je veux dire.

Dans une url avec des variables, il y a un '?' pour indiquer la première variable et des '&' pour les suivantes.

La Regex doit fonctionner avec 0,1 ou plusieurs variables dans l'url.

Code : Tout sélectionner

?page=blablabla ?page=blablabla&a=a ?page=blablabla&a=a&b=b ?page=blablabla&a=a&b=b&c=c etc...
Quand je parle de ? ou de * c'est dans la Regex :D
Pour indiquer la présence éventuelle et la répétition de variables.
Le but final étant de ne récupérer que 'blablabla'.

Re: Problème avec une Regex

par ploupy » 07 mars 2012, 23:55

il te suffit de recherche dans ton url avecs ces fonctions l' expression qui se trouve entre ?page= et ?
si il peut y avoir *, tu remplace tous les * par ? avant....

non ??




peut tu donner quelques exemple d'autre URL que tu as pour voir si cela fonctionne



je crois savoir ton soucis enfgin dit moi si je me trompe :
$url = preg_replace('#\/\?page=(.+)&(.+)?#i', '$1', $url);

dedans tu as mis un ? ord je crois qu'il a une fonction precise lors des expressions régulières donc faut pas que le mettre en tant q'expression enfin je sais pas

Re: Problème avec une Regex

par CyberTaf » 07 mars 2012, 23:14

Merci, mais en fait je sais à peu près comment on fait pour travailler sur une chaîne.
Là ou je bute, c'est sur la condition d'une seconde variable, donc la détection d'un ou plusieurs '&' dans l'URL et la non prise en compte de celles-ci.
Je pense qu'il faut mettre en "option" le '&' dans l'URL avec un ? ou un *, mais c'est là que je cale... :?

Re: Problème avec une Regex

par ploupy » 07 mars 2012, 23:05

je viens de trouver une fonction ( qui ne resou pas ton probleme mais qui te montre un exemple de travail sur une chaine
$TaVarableURL = ereg_replace("(http://)(([[:punct:]]|[[:alnum:]])*)",
					  "<a href=\"\\0\">\\2</a>",$TaVarableURL);

à chercher Les fonctions de manipulation d'expressions régulières

Re: Problème avec une Regex

par ploupy » 07 mars 2012, 23:01

a ok.

alors toi tu dois savoir moi je connais pas trop ces fonctions mais il me semble que tu peux faire des sélection dans une chaine.

genre right($vaariable) a partir du ?

et ensuite un un left ($variable a partir de la prochaine lettre.


de façon a ce que tu récupéré la variable.


désolé je connais pas trop ces fonctions mais tu vois ce que je veux dire ??

Re: Problème avec une Regex

par CyberTaf » 07 mars 2012, 22:55

Si ça marcherait. Mais dans le cas présent, les URL sont stockée en BDD avec $_SERVER['REQUEST_URI'], donc avec les variables, et c'est sur ce qui est stocké en BDD que je dois travailler.