Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/02/2006, 12h15   #1
Candidat au titre de Membre du Club
 
Inscription : mai 2005
Messages : 53
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 53
Points : 10
Points : 10
Par défaut Php et expressions regulières

Salut à tous,

voilà, j'aimerais récupérer des parties d'une chaine via une expression régulière.

Les délimiteurs sont DA,DB ou DC.
Pb : on ne sait pas si tout les delimiteur y sont.

Exemple les chaines (j'ai mis des espaces pour que ce soit plus lisible) :

DC aaaa DA bbbb DC ggggg DA hhhhh DB iiiiii
ou
DC aaaaa DB iiii

je n'arrive pas à trouver cette putain d'expression !
(je sais utiliser ereg)

Je sais que dedans doit y avoir un truc du genre :
(.*)(DA|DB|DC)(.*) mais je comprends pôôÔÔ...
-> dans ce cas il me renvoie en
1er : DC aaaa DA bbbb DC ggggg DA hhhhh DB
2eme : iiiii
et j'ai du mal à isoler chaque partie.


Et de façon générale dans une chaine du type :
DA aaa DA bbbbbb DA ccccc DA
comment on récupère juste le aaaa ??

RUn grand merci !
guano est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2006, 12h19   #2
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Salut

Avec ceci, peut-être ?

Code :
1
2
3
4
5
6
$string = 'DC aaaa DA bbbb DC ggggg DA hhhhh DB iiiiii';
$array = preg_split('/(?:DA|DB|DC)/', $string);
 
echo '<pre>';
print_r($array);
echo '</pre>';
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2006, 12h27   #3
Candidat au titre de Membre du Club
 
Inscription : mai 2005
Messages : 53
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 53
Points : 10
Points : 10
Merci de ta réponse.
Oui j'avais pensé au split mais comment savoir quelle partie est lié avec tel délimiteur ?

exemple : DC aaaa DA bbbb DC ggggg DA hhhhh DB iiiiii

comment savoir que pour aaaa c'est le deliteur DC ?
comment savoir que pour bbbb c'est le deliteur DA ?

etc...
merci.
guano est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2006, 13h03   #4
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Là, désolé, je ne pane vraiment rien à ton problème.

Sinon, tu as une autre solution (dans mon état de fatigue, je ne peux pas mieux faire mais peut-être demain) :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
$string = 'DC aaaa DA bbbb DC ggggg DA hhhhh DB iiiiii';
preg_match_all('/DA(.*?)(?:DB|DC)/', $string, $matches_da);
preg_match_all('/DB(.*?)(?:DA|DC)/', $string, $matches_db);
preg_match_all('/DC(.*?)(?:DA|DB)/', $string, $matches_dc);
 
echo '<pre>';
echo '<font color="blue">DA</font><br />';
print_r($matches_da);
echo '<br /><br /><br /><font color="blue">DB</font><br />';
print_r($matches_db);
echo '<br /><br /><br /><font color="blue">DC</font><br />';
print_r($matches_dc);
echo '</pre>';
Là, il ne va pas trouver iiiitruc car il lui manque un délimiteur de fin... Teste sa présence et ajoute-le si besoin.
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2006, 14h45   #5
Candidat au titre de Membre du Club
 
Inscription : mai 2005
Messages : 53
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 53
Points : 10
Points : 10
Oui excuse moi c pas très clair , voilà mon pb reformulé:

En fait je peux avoir plusieurs delimiteur ex:
TITRE AUTEUR PRIX EDITEUR
donc je peux avoir:

TITRE les expressions régulières c'est caca AUTEUR Guano PRIX 20€ EDITEUR Prise de tête & Co

(y'a pas d'espace normalement)

mais également :
TITRE les expressions régulières c'est caca PRIX 20€


et je veux juste récupérer les infos en savant à quoi ca correspond...
guano est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2006, 14h56   #6
Membre habitué
 
Avatar de ciesco
 
Inscription : février 2004
Messages : 110
Détails du profil
Informations forums :
Inscription : février 2004
Messages : 110
Points : 119
Points : 119
Moi moi!
Je tente...
Je dirais :

Code :
1
2
3
 
$string = 'DC aaaa DA bbbb DC ggggg DA hhhhh DB iiiiii'; 
preg_match_all('!D[ABC](.*)D[ABC]!U', $string, $matches);
ciesco est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2006, 16h07   #7
Candidat au titre de Membre du Club
 
Inscription : mai 2005
Messages : 53
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 53
Points : 10
Points : 10
Puré c'est tout con mais j'y arrive pô...

j'aimerais comprendre un truc voila une chaine :

TRUCtotoTRUCtitiTRUCtataTRUC

quand je fais comme exp reg :

(.*)(TRUC) ça me renvoie : totoTRUCtitiTRUCtata
et en fait je voudrais juste toto, puis après je me démerde pour avoir le reste.
guano est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2006, 16h25   #8
Membre habitué
 
Inscription : février 2006
Messages : 109
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 109
Points : 120
Points : 120
Citation:
Envoyé par guano
Puré c'est tout con mais j'y arrive pô...

j'aimerais comprendre un truc voila une chaine :

TRUCtotoTRUCtitiTRUCtataTRUC

quand je fais comme exp reg :

(.*)(TRUC) ça me renvoie : totoTRUCtitiTRUCtata
et en fait je voudrais juste toto, puis après je me démerde pour avoir le reste.
Pour ca tu peux utiliser :
Code :
1
2
3
4
5
6
7
 
$texte="totoTRUCtitiTRUCtata"; 
 
$chaine = explode("TRUC", $texte); 
echo $chaine [0]; // donne "toto" 
echo $chaine [1]; // donne "titi"
etc ...
avec un foreach $index => $chaine tu recupere tout.
dev_php_205 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2006, 16h28   #9
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Sérieusement, as-tu essayé le code que je t'ai donné ci-dessus ? Ne te convient-il pas ?
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2006, 16h19   #10
Membre émérite
 
Inscription : mai 2004
Messages : 708
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : mai 2004
Messages : 708
Points : 853
Points : 853
Citation:
Envoyé par guano
Oui excuse moi c pas très clair , voilà mon pb reformulé:

En fait je peux avoir plusieurs delimiteur ex:
TITRE AUTEUR PRIX EDITEUR
donc je peux avoir:

TITRE les expressions régulières c'est caca AUTEUR Guano PRIX 20€ EDITEUR Prise de tête & Co

(y'a pas d'espace normalement)

mais également :
TITRE les expressions régulières c'est caca PRIX 20€

et je veux juste récupérer les infos en savant à quoi ca correspond...
Kirkis t'a mis sur la voie plus haut. Tu peux utiliser preg_split avec l'option PREG_SPLIT_DELIM_CAPTURE qui te capturera également les délimiteurs. Après, c'est un simple exercice de manip de tableaux.

Code :
1
2
3
4
5
6
7
8
9
$txt = "TITREles expressions régulières c'est génialAUTEURGuanoPRIX 20€ EDITEURPrise de tête & Co";
 
$split = preg_split('#(TITRE|AUTEUR|PRIX|EDITEUR)#', $txt, -1, PREG_SPLIT_DELIM_CAPTURE);
 
$iMax = count($split);
for ($i = 1; $i < $iMax; $i += 2 ){
  $resultat[$split[$i]] = $split[$i+1];
}
echo '<pre>'; print_r($resultat); echo '</pre>';
ripat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2006, 23h00   #11
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
ripat : Merci pour ton soutien, cependant ta solution ne convient pas car notre ami souhaite savoir ce qui a été délimité ainsi que par quoi ça a été délimité, or ton expression splitte aveuglément :/

Dans cette profusion d'exemples, je répète ma proposition qui fonctionne :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$string = 'TITRE les expressions régulières c\'est caca AUTEUR Guano PRIX 20€ EDITEUR Prise de tête & Co END';
preg_match_all('/TITRE(.*?)(?:AUTEUR|PRIX|EDITEUR|END)/', $string, $matches_titre);
preg_match_all('/AUTEUR(.*?)(?:TITRE|PRIX|EDITEUR|END)/', $string, $matches_auteur);
preg_match_all('/PRIX(.*?)(?:TITRE|AUTEUR|EDITEUR|END)/', $string, $matches_prix);
preg_match_all('/EDITEUR(.*?)(?:TITRE|AUTEUR|PRIX|END)/', $string, $matches_editeur);
 
echo '<pre>';
 
echo '<font color="blue">TITRE</font><br />';
print_r($matches_titre);
 
echo '<br /><br /><br /><font color="blue">AUTEUR</font><br />';
print_r($matches_auteur);
 
echo '<br /><br /><br /><font color="blue">PRIX</font><br />';
print_r($matches_prix);
 
echo '<br /><br /><br /><font color="blue">EDITEUR</font><br />';
print_r($matches_editeur);
 
echo '</pre>';
Note que la seule contrainte est l'ajout d'un délimiteur bidon à la fin de la chaîne : END.
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2006, 09h15   #12
Membre émérite
 
Inscription : mai 2004
Messages : 708
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : mai 2004
Messages : 708
Points : 853
Points : 853
Citation:
Envoyé par Kirkis
... notre ami souhaite savoir ce qui a été délimité ainsi que par quoi ça a été délimité
Ben oui, c'est exactement ce que fait mon snippet il me semble.

Essaye-le.
ripat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2006, 15h26   #13
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Arf...
Comme quoi on devrait toujours suivre ses propres conseils (en l'occurence tester un extrait de code avant d'en médire).
Ta proposition me semble parfaite, plus simple que la mienne, pas contraignante, nickel quoi. Désolé.
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2006, 10h32   #14
Candidat au titre de Membre du Club
 
Inscription : mai 2005
Messages : 53
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 53
Points : 10
Points : 10
Merci !!!!!!!!!!!!


guano est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h43.


 
 
 
 
Partenaires

Hébergement Web