Aide 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 : Aide Regex

Re: Aide Regex

par Bo$$ Bravo » 02 sept. 2011, 12:41

Pas de soucis, je vais m'y mettre aussi et demander a quelques contacts, je tient au courant si je trouve :D

Re: Aide Regex

par Cyrano » 01 sept. 2011, 20:08

Là j'ai l'impression qu'il va falloir passer par un preg_replace_callback parce que je ne sais pas trop comment le faire en une seule passe... et en le faisant je réalise que mes essais ne marchent pas... et comme nos deux gourous du RegExp ne viennent quasiment plus pour l'un et plus du tout pour l'autre, ça va pas être simple. Faut que je me penche un peu plus dessus parce qu'en fin de compte je trouve pas, je vais revenir... :?

Et au passage, un très bon tuto sur le sujet est toujours en ligne sur lumadis.be, tu y trouveras sûrement des éléments utiles.

[Edit]
Bon ben je manque de temps. À priori, il faut passer par des assertions, mais je n'arrive pas à trouver la bonne formule pour exprimer correctement les éléments. Faudra que je revienne dessus, désolé de pas pouvoir t'aider mieux :(
[/Edit]

Re: Aide Regex

par Bo$$ Bravo » 01 sept. 2011, 19:15

Déjà, je voudrait te remercier, tu explique super bien :D

En ce qui concerne ce que j'ai fait cet aprem, au début c'était bien organisé, mais à la fin, je perdait patience et c'était un peu le fouillis.
Bref, je sais que je doit sélectionner un espace, donc déjà, c'est (\s)
Mais là ou sa commence à se corser c'est que je doit le faire uniquement dans les balises, or je ne sait pas comment faire pour mettre les balises (ce sera \[beta1\] et \[/beta1\]) sans qu'elles soient sélectionnées dans le remplacement

Le code serait :

Code : Tout sélectionner

/(\s)/g
En fait, j'ai fait des tests en mettant les balises dans le pattern mais les balises sont intégrées dans le remplacement.

Re: Aide Regex

par Cyrano » 01 sept. 2011, 18:22

Ok, alors on doit reprendre de la même manière : il faut isoler les éléments à trouver et traduire ça ensuite en regexp.

Fais déjà voir ce que tu as fait en expliquant chaque élément et on corrigera au fur et à mesure.

Si tout ceci ne te parle pas trop, représente-toi la précédente expression régulière : par exemple décomposons celle-ci :
$opentag = "#<\?(?:php)?#i";
  • On a les délimiteurs « # »;
  • on a un « i » final qui signifie « insensible à la casse » (majuscules/minuscules) permettant de trouver aussi bien <?php que <?PHP ou encore <?PhP;
  • On a le début du tag php à trouver, « < » suivi d'un « ? » qu'on échappe parce que c'est un caractère spécial réservé dans les RegExp, donc « <\? »
  • Ensuite une paire de parenthèses pour trouver une expression spécifique avec différents éléments :
    • d'abord une paire « ?: » pour rendre les parenthèses « non-capturantes », en anglais dans les documentations, tu verras le terme de « non greedy » ou « non-gourmand »;
    • ensuite l'expression recherchée, ici les lettres « php »;
    • Enfin on termine par un « ? » après la parenthèse fermante, ce qui signifie que ce qui est recherché par le contenu de ces parenthèses peut ou non s'y trouver, équivalent en quelque sorte à « 0 ou 1 fois »
Décompose donc l'expression que tu as tenté pour ton remplacement d'espaces en détaillant les éléments de la même manière. À mon avis si tu fais ça soigneusement, tu vas probablement faire de toi-même des correctifs avant même de poster ta réponse ici, et peut-être même du coup trouver toi-même la solution ;)

Re: Aide Regex

par Bo$$ Bravo » 01 sept. 2011, 18:07

J'ai encore un soucis avec le Regex, j'ai cherché le pattern pendant 1h, mais pas moyen.

J'ai une chaîne de caractères comme suit :

Code : Tout sélectionner

1 23 alpha 2.2250 not12 [beta1] 12 areach 14; [/beta1]
et je voudrait remplacer les espaces qui sont entres les balises beta1 par [espace] mais je ne veut pas remplacer les espaces qui ne sont pas entre les balises :D

Cdt.

Re: Aide Regex

par Bo$$ Bravo » 31 août 2011, 20:42

Oui, en effet, c'était ça et str_replace("\\", "", $original_code_1); qui faisait buguer le truc, je les ais mis après le remplacement des balises php (car ils me servent plus loin) et ça marche nickel.
Merci de votre aide. J'ai du mal avec le Regex :P

Re: Aide Regex

par Cyrano » 31 août 2011, 19:32

Normal, si tu ne donnes pas certaines informations essentielles, on ne pourra pas te donner la bonne réponse.

Et ça ne fonctionne pas tout simplement parce que tu utilises htmlentities() qui transforme les < en < et les < en > et donc ça ne correspond plus aux masques des expressions régulières.

Re: Aide Regex

par Bo$$ Bravo » 31 août 2011, 18:09

Ne fonctionne pas non plus, le code ne bouge pas par rapport au début ?

voici mon code entier, peut-être trouverez-vous un problème plus haut ? :

Code : Tout sélectionner

$original_code = $_POST['code']; echo $original_code; echo '<br /><br />'; $original_code_1 = htmlentities($original_code); $original_code_2 = str_replace("\\", "", $original_code_1); echo $original_code_2; echo '<br /><br />'; $opentag = "#<\?(?:php)?#i"; $closetag = "#\?>#"; $s_1 = preg_replace($opentag, '[php]', $original_code_2); $original_code_3 = preg_replace($closetag, '[/php]', $s_1); echo $original_code_3;

Re: Aide Regex

par Cyrano » 31 août 2011, 16:51

Hé, vous vous y prenez un peu à l'arrache.

Décomposez d'abord et ensuite appliquez en utiisant preg_replace.

D'abord les masques, tu as trois possibilités dont deux pour la balise ouvrante, une pour la fermante.
  1. Balise ouvrante version short_open_tag : « <? »
  2. Balise ouvrante normale : « <?php »
  3. Balise fermante : « ?> »
ensuite,le masque de remplacement dépend du type de balise, ouvrante ou fermante et de la présente ou non de parenthèses capturantes dans le masque de recherche. Vu la simplicité du truc, on se torturera pas les méninges outre mesure pour le remplacement.
On va créer deux masques, un pour l'ouvrante quelle que soit la version et un autre pour la fermante :
<?php
$opentag = "#<\?(?:php)?#i";
$closetag = "#\?>#";

$ducode_a_traiter = '<?php $mavar = "ma_valeur"; ?>';
$s_1 = preg_replace($opentag, '[php]', $ducode_a_traiter);
$s_2 = preg_replace($closetag, '
', $s_1);
echo("<pre>\n");
var_dump($s_2);
echo("</pre>\n");
// affiche à l'écran
// string(34) "
 $mavar = "ma_valeur"; 
"[/php]

Le plus compliqué en réalité est le premier masque pour ne pas négliger les short_open_tag sans pour autant faire deux masques et ça empêcher du coup l'utilisation du "$1" en remplacement puisqu'il y manque le « php » du « <?php ».

Enjoy ! ;)

Re: Aide Regex

par popy » 31 août 2011, 16:37

J'ai oublié un \ :

preg_replace('/<\?(php)?(.*?)((\?>)|$)/', '
\2[\php]', ...

Re: Aide Regex

par Bo$$ Bravo » 31 août 2011, 15:43

Pareil, ça me ressort

Code : Tout sélectionner

<?php echo $absolute ;?>

Re: Aide Regex

par popy » 31 août 2011, 15:36

Et avec :

preg_replace('/<\?(php)?(.*?)((?>)|$)/', '
\2[\php]', ...


?

Re: Aide Regex

par Bo$$ Bravo » 31 août 2011, 14:59

preg_replace("/<\?php(.*?)\?>/", "
$1
", $code1);


Si je met ça, il me sort cela :

Code : Tout sélectionner

<?php echo $absolute ;?>
Donc, c'est comme si la fonction ne marchait pas maintenant :\


Et je l'ai aussi modifiée pour que ça passe si il n'y a pas le texte 'php' dans la balise :

Code : Tout sélectionner

preg_replace("<\?(php)?(.*?)\?>", "[php]$2[/php]", $original_code_1);

Re: Aide Regex

par popy » 31 août 2011, 10:19

preg_replace("/<\?php(.*?)\?>/", "
$1
", $code1);

Re: Aide Regex

par Bo$$ Bravo » 31 août 2011, 08:08

Recherche : /<\?php(.*?)\?>/
Remplace :
$1
Ca marche sur http://gskinner.com/RegExr/

http://regexr.com?2uiv8
Je ne connaissait pas http://gskinner.com/RegExr/ merci beaucoup a toi ;)

Sauf que moi il me sort :

Code : Tout sélectionner

<[php] echo $absolute ;[/php]>
Mon code :

Code : Tout sélectionner

preg_replace("<\?php(.*?)\?>", "[php]$1[/php]", $code1);