Page 1 sur 1

REGEX : petit casse tête...

Posté : 24 juin 2008, 23:45
par supercanard
Bonsoir,

Je bloque sur un problème. En partie parce que je n'ai jamais trop pratiqué les regex... et ça me parais assez compliqué.

Voilà tout dabord quelques explications. Mon but est de rechercher dans un doc HTML des balises spéciales ayant la forme %%TOTO%% par exemple.
Et de les remplacer par l'exécution ou plutôt le résultat d'une fonction.

Exemple, je recherche ici la balise %%TOTO%%, et je la remplace par l'appel d'une fonction :
$recherche[5] = '%%TOTO%%';
$remplacement[5] = $resultat = AfficherChose();
$html = str_replace( $recherche, $remplacement, $html );
Jusque là pas trop de problème...

La ou je bloque c'est dans la cas ou j'ai besoin de passer un paramètre à la fonction AfficherChose. Ce paramètre dois venir évidement de la balise. La balise aura donc par exemple la forme suivante : %%TOTO"parametre"%%
Donc la logique est d'isoler le paramètre entre guillemet de la balise pour pouvoir faire : AfficherChose( $valeur )

J'ai donc pondu un code franchement horrible et long :


// $html = "%%TOTO"parametre"%%";

// On cherche les "" et leur contenu dans la chaine %%TOTO%%
eregi( '%%TOTO"(.*)"%%', $html, $resultat );
$valeur = $resultat[0];
// On isole le parametre
eregi( '"(.*)"', $valeur, $resultat );
$valeur = $resultat[0];
$length = strlen( $valeur ) - 2;
// On enlèves le premier et le dernier caractères (")
$valeur = substr( $valeur, 1, $length );

// $valeur est donc egal à :  parametre
Déjà je sais bien qu'eregi n'est pas conseillé, mais sans parler de ça c'est un peu lourd comme code non ?
Si vous avez une autre piste ( plus légère)... :roll:

Posté : 25 juin 2008, 00:06
par Shrell
hello
En partant du principe que la valeur entre guillemets ne contiendra elle même pas de guillemets :
preg_match('#%%TOTO"([^"]+)"%%#', $html, $resultats);
Explication : les # sont des délimiteurs, ils n'ont pas de valeur dans l'expression
l'expression [^"]+ veut dire au moins un caractère différent de "
Enfin les parenthèses autour sont des parenthèses capturantes.
En résultat, tu te retrouves donc avec, dans le tableau $resultats :
$resultats[0] = %%TOTO"monparametre"%%
$resultats[1] = monparametre

Si il est possible d'avoir plusieurs fois cette balise dans $html, alors penche toi sur preg_match_all(), il n'y a que la façon de parcourir $resultats qui change ;)

Posté : 25 juin 2008, 13:25
par supercanard
C'est relativement beaucoup plus court :D

Preg_match_all correspond bien àa ce que je cherche.
Je suppose que ce qui change c'est qu'il faut parcourir le tableau avec foreach