Preg_match_all comment faire ?

Signaler
Messages postés
163
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
3 février 2012
-
Messages postés
239
Date d'inscription
samedi 21 février 2004
Statut
Membre
Dernière intervention
3 juin 2010
-
Bonjour,

Je ne suis pas très a l'aise dans les preg_match_all et je bloque un peu sur cette idée :

J'ai une chaîne définit comme cela :

!view_client:*,view_client:view_all,client:*,!client:acl,!client:domaine,!commercial:*,member:*,view_client:toto

J'aimerais a partir de cette chaîne obtenir un tableau de cette forme la

$tab = array("view_all", "toto");

Explication :

Il faut prendre ce qu'il se trouve après "view_client:" mais pas si un "!" est devant

Si quelqu'un aurait une idée de la requète preg_match ou avec une autre solution je l'écoute attentivement.

Merci. ++ Nexus Chaque problème a sa solution. S'il n'y a pas de solution c'est qu'il n'y a pas de problème.

1 réponse

Messages postés
239
Date d'inscription
samedi 21 février 2004
Statut
Membre
Dernière intervention
3 juin 2010
1
Salut,

alors à première vue, je vois 2 solutions:

1) la 1ere consiste à exploser la chaine à l'aide de plusieurs explode() consécutifs, le 1er pour séparer chaque séquence 'xxx:yyy' et le 2eme pour séparer chaque donnée 'xxx yyy'. Enfin, il faut tester si le 1er caractère de la donnée x est un ! et si la donnée x = client_view.

2) l'utilisation des regex. Comparé à la première méthode, celle-ci demande un peu plus de réflexion ,notamment, pour la recherche du masque de filtrage (pattern).

Dans tous les cas, c'est la solution qui s'execute le plus vite qu'il faut privilégier. A toi de voir laquelle est la plus rapide.

Malgré tout, voici un exemple implémentant la solution regex. Petit hic, la dernière donnée doit absolument se terminer par une virgule.

<?php
$key = 0;
$result = array();

$str2parse = '!view_client:*,view_client:view_all,client:*,!client:acl,!client:domaine,!commercial:*,member:*,view_client:toto,';
$pattern = '#(!?)(view_client):(.+?),#i';
preg_match_all($pattern,$str2parse,$matches,PREG_SET_ORDER);

$count = count($matches);
for ($i=0; $i<$count; $i++)
{
if ($matches[$i][1] != '!')
{
$result[$key][ $matches[$i][2] ] = $matches[$i][3];
$key++;
}
}
echo '',print_r($result),'

';
?>