Page 1 sur 2

Aide Regex

Posté : 30 août 2011, 22:36
par Bo$$ Bravo
Bonjour a vous !

J'ai un problème pas compliqué a comprendre, par exemple, j'ai une chaine de caractère comme suit :

Code : Tout sélectionner

<?php echo $more1;?>
et j'aimerais la remplacer par

Code : Tout sélectionner

[php] echo $more1;[/php]
Je pense que je dois passer par la fonction preg_replace, mais je n'y arrive pas, pouvez-vous m'aidez svp ?

Cdt.
Bo$$ Bravo

Re: Aide Regex

Posté : 31 août 2011, 01:14
par devlop78
Recherche : /<\?php(.*?)\?>/
Remplace :
$1
Ca marche sur http://gskinner.com/RegExr/

http://regexr.com?2uiv8

Re: Aide Regex

Posté : 31 août 2011, 08:08
par Bo$$ Bravo
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);

Re: Aide Regex

Posté : 31 août 2011, 10:19
par popy
preg_replace("/<\?php(.*?)\?>/", "
$1
", $code1);

Re: Aide Regex

Posté : 31 août 2011, 14:59
par Bo$$ Bravo
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

Posté : 31 août 2011, 15:36
par popy
Et avec :

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


?

Re: Aide Regex

Posté : 31 août 2011, 15:43
par Bo$$ Bravo
Pareil, ça me ressort

Code : Tout sélectionner

<?php echo $absolute ;?>

Re: Aide Regex

Posté : 31 août 2011, 16:37
par popy
J'ai oublié un \ :

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

Re: Aide Regex

Posté : 31 août 2011, 16:51
par Cyrano
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

Posté : 31 août 2011, 18:09
par Bo$$ Bravo
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

Posté : 31 août 2011, 19:32
par Cyrano
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

Posté : 31 août 2011, 20:42
par Bo$$ Bravo
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

Posté : 01 sept. 2011, 18:07
par Bo$$ Bravo
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

Posté : 01 sept. 2011, 18:22
par Cyrano
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

Posté : 01 sept. 2011, 19:15
par Bo$$ Bravo
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.