Aide Regex

Eléphanteau du PHP | 34 Messages

30 août 2011, 22:36

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

devlop78
Invité n'ayant pas de compte PHPfrance

31 août 2011, 01:14

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

http://regexr.com?2uiv8

Eléphanteau du PHP | 34 Messages

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);

Eléphant du PHP | 275 Messages

31 août 2011, 10:19

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

Eléphanteau du PHP | 34 Messages

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);

Eléphant du PHP | 275 Messages

31 août 2011, 15:36

Et avec :

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


?

Eléphanteau du PHP | 34 Messages

31 août 2011, 15:43

Pareil, ça me ressort

Code : Tout sélectionner

<?php echo $absolute ;?>

Eléphant du PHP | 275 Messages

31 août 2011, 16:37

J'ai oublié un \ :

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

Mammouth du PHP | 19672 Messages

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 ! ;)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 34 Messages

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;

Mammouth du PHP | 19672 Messages

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.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 34 Messages

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

Eléphanteau du PHP | 34 Messages

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.

Mammouth du PHP | 19672 Messages

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 ;)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 34 Messages

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.