Webmaster Hub: REGEXP multi-lignes en PHP - Webmaster Hub

Aller au contenu

Page 1 sur 1
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

REGEXP multi-lignes en PHP Noter : -----

#1 L'utilisateur est hors-ligne   adn 

  • ADN l'origine...
  • Groupe : Membre+
  • Messages : 1 134
  • Inscrit(e) : 24-janvier 04
  • Genre:Homme
  • Localisation:-40m
  • Société:ADN Création

Posté 01 août 2005 - 11:33

Hello,

Je coince ce matin sur la formulation d'une REGEXP pour remplacer une balise par une autre en prenant en compte le multi-ligne. J'ai bien vu qu'il y a avait une option PCRE_DOTALL pour dire que le point passe outre les retours chariot mais je ne sais pas comment l'intégrer dans l'expression.

Voici le code :

// replace
$fichnew = preg_replace("#<div id=\"tutu\">(.*)<\/div>#", "<h3>$1</h3>", $fich);

// ecriture du fichier modifié
if (strcmp($fichnew, $fich) != 0)
{
      ....


Si vous avez mieux en terme d'expression, n'hésitez pas Merci :)

Allez tant que j'y suis... comment ne pas être dépendant du nombre de blancs entre la balise DIV et ID= ?

Ce message a été modifié par adn - 01 août 2005 - 11:35.

0

#2 L'utilisateur est hors-ligne   TheRec 

  • Groupe : Admin
  • Messages : 1 757
  • Inscrit(e) : 18-janvier 05
  • Localisation:Lausanne
  • Société:HexaDec Sàrl

Posté 01 août 2005 - 11:51

Bonjour,

$fichnew = preg_replace("/<div[\s]*id=\"tutu\">(.*)<\
/div>/sm", "<h3>$1</h3>", $fich);


"sm" correspond (non pas à ça, tss tss tss...) à PCRE_DOTALL et PCRE_MULTILINE ... normalement ça devrait suffir...

**EDIT** J'avais loupé la deuxième question, j'ai édité le code pour y répondre...

Ce message a été modifié par TheRec - 01 août 2005 - 12:08.

0

#3 L'utilisateur est hors-ligne   adn 

  • ADN l'origine...
  • Groupe : Membre+
  • Messages : 1 134
  • Inscrit(e) : 24-janvier 04
  • Genre:Homme
  • Localisation:-40m
  • Société:ADN Création

Posté 01 août 2005 - 15:18

Merci TheRec,

J'ai essayé ta proposition mais c'est pas encore çà :

Il ne remplace plus que <div id="tutu"> par <h3> et pas le </div> par </h3>, curieux ??

Et il ne remplace que la première occurence de ce pattern. Je voudrais qu'ils les change toutes ....

Verrais-tu le souçi ?

Ce message a été modifié par adn - 01 août 2005 - 15:19.

0

#4 L'utilisateur est hors-ligne   adn 

  • ADN l'origine...
  • Groupe : Membre+
  • Messages : 1 134
  • Inscrit(e) : 24-janvier 04
  • Genre:Homme
  • Localisation:-40m
  • Société:ADN Création

Posté 01 août 2005 - 15:46

Sur la base de ton exemple, j'ai tatonné et j'ai trouvé çà qui marche:

$fichnew = preg_replace("/<div[\s]*id=\"tutu\">(.*?)<
\/div>/smi", "<h3>$1</h3>", $fich);


Le ? débloque le pb du multi-ligne et je ne sais pas pourquoi ??

Ce message a été modifié par adn - 01 août 2005 - 15:47.

0

#5 L'utilisateur est hors-ligne   TheRec 

  • Groupe : Admin
  • Messages : 1 757
  • Inscrit(e) : 18-janvier 05
  • Localisation:Lausanne
  • Société:HexaDec Sàrl

Posté 01 août 2005 - 16:03

Effectivement ça marche... à noter que ce n'est pas le "m" mais le "s" qui semble causer le problème chez moi :S

Si quelqu'un peut nous dire pourquoi, qu'il n'hésite pas :D

Ce message a été modifié par TheRec - 01 août 2005 - 16:05.

0

#6 L'utilisateur est hors-ligne   TheRec 

  • Groupe : Admin
  • Messages : 1 757
  • Inscrit(e) : 18-janvier 05
  • Localisation:Lausanne
  • Société:HexaDec Sàrl

Posté 01 août 2005 - 16:20

$re = "/<body>.*^(.+)(^.*?^)(.+)(^<\\/body>.*?)
/smU";

Citation

The two (.+) are supposed to match the first and last lines within the <body> tag.  The /s option (dot all) is needed so the .* can also match newlines.  The /m option (multiline) is needed so that the ^ can match newlines.  The /U option (ungreedy) is needed so that the .* and .+ will only gobble up the minimum number of characters necessary to get to the character following the * or +.  The exception to this, however, is that the .*? temporarily overrides the /U setting on .* turning it from non greedy to greedy.  In the middle, this ensures that all the lines except the first and last (within the <body> tag) are put into $aMatch[2].  At the end, it ensures that all the remaining characters in the string are gobbled up, which could also have been achieved by .*)\\z/ instead of .*?)/


Et si je fais :
$fichnew = preg_replace("/<div[\s]*id=\"tutu\">(.*)<\
/div>/smiU", "<h3>$1</h3>", $fich);

Hé bien oh miracle ça marche... Voici le mode ungreedy:

Citation

U (PCRE_UNGREEDY)
Cette option inverse la tendance à la gourmandise des expressions rationnelles. Vous pouvez aussi inverser cette tendance au coup par coup avec un ?. De même, si cette option est activée, le ? rendra gourmand une séquence. Cette option n'est pas compatible avec Perl. Elle peut aussi être mise dans le masque avec l'option ?U dans le pattern ou par un point d'interrogation avant le quantifieur (.e.g. .*?).


En utilisant "?" après "*" tu as activé le mode UNGREEDY... :D

Ce message a été modifié par TheRec - 01 août 2005 - 16:21.

0

#7 L'utilisateur est en ligne   Dan 

  • Webmaster
  • Voir le blog
  • Voir la galerie
  • Groupe : Direction
  • Messages : 22 941
  • Inscrit(e) : 18-août 03
  • Genre:Homme
  • Localisation:St Anne, Alderney
  • Société:Webmaster Hub Ltd.

Posté 01 août 2005 - 16:53

Bravo à TheRec... ce post mérite d'être épinglé :up:

Dan
La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.
Si la pratique et la théorie sont réunies, rien ne fonctionne et on ne sait pas pourquoi. - Albert Einstein -
Infogérance de serveurs dédiés OVH
0

#8 L'utilisateur est hors-ligne   TheRec 

  • Groupe : Admin
  • Messages : 1 757
  • Inscrit(e) : 18-janvier 05
  • Localisation:Lausanne
  • Société:HexaDec Sàrl

Posté 01 août 2005 - 18:10

Merci ;)
Le mérite en revient aussi aux commentaires/commentateurs du manuel PHP qui m'ont déjà maintes et maintes fois appris grandement ;)

Merci pour ma première épingle :fete:
0

#9 L'utilisateur est hors-ligne   bigornot 

  • Groupe : Membre
  • Messages : 249
  • Inscrit(e) : 16-février 04
  • Localisation:GAGNY

Posté 05 janvier 2006 - 20:43

Et tant qu'on y est, je rajoute un petit lien vers un très bon tutorial sur les REGEXP :

http://www.siteduzero.com/tuto-3-168-1-les...partie-1-2.html
0

Partager ce sujet :


Page 1 sur 1
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

1 utilisateur(s) en train de lire ce sujet
0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)