Expression régulière balaise

Signaler
Messages postés
122
Date d'inscription
mardi 19 novembre 2002
Statut
Membre
Dernière intervention
10 mars 2011
-
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
-
Bonjour!

Je cherche depuis un moment un moyen de faire une expression régulière pour résoudre ce genre de cas:

du texte divers {une_string un_param= "une valeur" un_autre="12"} et le texte qui continue, avec éventuellement un autre {autre} sans paramètres.


L'idée étant d'extraire chaque {xxx accompagnés de leur xxx =xxx autant de fois qu'il y en a.

Et... ben c'est pas évident

Voilà ce que j'ai pu faire jusqu'à présent:
$content = "Voir l'exemple ci-dessus";
$reg = "/(\{|%7B)(\w*)( (\w*)=(\w*))*(\}|\%7D)/i";
preg_match_all($reg, $content, $matches, PREG_SET_ORDER);
if ($matches) {
    foreach ($matches as $match) {
        // récupération du nom de la variable
        $index_name = $match[2];
        // récupération de la paire clé=valeur
        $index_params array($match[4]> $match[5]);
        // on fait ensuite du code métier divers
        ...
    }
}


ça fonctionne bien, sauf que je n'arrive pas à récupérer toutes les pairs clé/valeur. Est-ce possible en une seule expression?

Merci d'avance!
rekam

2 réponses

Messages postés
2381
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
29 décembre 2012
16
Et un explode sur ta chaine avec l'espace en séparateur ? suivi d'une boucle sur chacun des éléments qui refait un explode avec le signe = en séparateur ?
Ce ne peut pas te convenir ?
S.
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
Salut Rekam,

Je pense comprendre ce que tu souhaites, cela étant pour tenter de faire une bonne regex il faut être le plus précis possible et étudier toutes les possibilités.

du texte divers {une_string un_param="une valeur" un_autre="12"} et le texte qui continue, avec éventuellement un autre {autre} sans paramètres.

Par exemple :
le biniou en jaune est il toujours un int ? ... ou peut il être une string, un float, ... ?
le bastringue en bleu peut il avoir des espaces, des car spéciaux ?
...

Ce ne sont là que des exemples, mais il est indispensable de le savoir pour mettre en place une regex efficace et la moins consommatrice possible.
Ca serait peut être une bonne idée que tu fournisses un fichier type qui contient toutes les situations possibles.

Indique également la taille de la chaîne à traiter (5 lignes ? 300 ?). Si elle est très faible il n'y a peut être pas lieu de s'embarrasser avec une regex et la piste proposée par Syndrael me semble être une bonne idée.

Cordialement,




Kohntark -