Expression régulière balaise

rekam Messages postés 122 Date d'inscription mardi 19 novembre 2002 Statut Membre Dernière intervention 10 mars 2011 - 24 févr. 2010 à 12:30
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 - 24 févr. 2010 à 19:55
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

syndrael Messages postés 2378 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 29 décembre 2012 20
24 févr. 2010 à 13:04
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.
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
24 févr. 2010 à 19:55
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 -
0
Rejoignez-nous