preg_match_all

preg_match_all - PHP - Programmation

Marsh Posté le 08-01-2007 à 17:12:56    

Bonjour,
 
Je veux récupérer à partir d'un texte, tout ce qui se trouve entre le To et To et ce, plusieurs fois dans le texte.
 
Exemple:
 
à chaque fois que je croise le To, je veux récupérer ce qui se trouve après, jusqu,au prochaine To, et ainsi de suite.
 
ce que j'ai fais a date est ceci:
 
    $expression = "/To(.*)To/";
    preg_match_all($expression, $montexte, $data, PREG_SET_ORDER);
    echo $data[0];  
 
qqu peux m'aider ?
 
Merci

Reply

Marsh Posté le 08-01-2007 à 17:12:56   

Reply

Marsh Posté le 08-01-2007 à 17:39:39    

Ton masque de recherche n'est pas adapté !
Utilise plutot #to(.*)to#Usi
Ca devrait mieux répondre a tes besoins

Reply

Marsh Posté le 08-01-2007 à 17:42:32    

toujours rien. Je n'ai pas d'erreur. Il m'affiche Array... on dirait qu'il n'y a rien dans mon tableau.

Reply

Marsh Posté le 08-01-2007 à 17:46:18    

xD
print_r($data);

Reply

Marsh Posté le 08-01-2007 à 17:46:31    

Voici mon code:
 
$texte ="To mon texte ici To";
$debut = "To";
$fin = "To";
parsetext($texte,$debut,$fin);
 
function parsetext($rapport,$debut,$fin){
    expression recherché
    $expression = "#$debut(.*)$fin#Usi";  
    $retour = array();
    $data =array();
    preg_match_all($expression, $rapport, $data, PREG_SET_ORDER);
 echo $data[0];  
 foreach ($data as $pr) {
            $retour = array_merge($retour, $pr);
        }
        return $retour;
}

Reply

Marsh Posté le 08-01-2007 à 17:50:54    

$data[0] -> tableaux des differentes captures effectuées avec le masque de recherche.
$data[0][0] -> la premiere capture effectuée avec le masque de recherche.
 
$data[1] -> tableaux des captures effectuées par la premiere parenthese capturante du masque de recherche
$data[1][0] -> la premiere capture effectuée par la premiere parentheses capturante du masque de recherche.
 
$data[2] -> tableaux de captures effectuées par la deuxieme parenthese capturante du masque de recherche
 
etc ...

Reply

Marsh Posté le 08-01-2007 à 17:55:26    

Ok nice.....Ça l'air à fonctionner. Je remet tout ça en morceau et je test cet après midi.  
 
Ca fesait un bon 2 heures que je galèrais sur ce prob. Merci afbilou.
 

Reply

Marsh Posté le 08-01-2007 à 18:07:47    

Y a un petit problème par contre, c'est que lorsqu'il ya un retour de chariot dans mon texte j'ai un erreur du genre....Undefined offset: 0  
 

Reply

Marsh Posté le 08-01-2007 à 18:11:48    

Probleme réglé avec un str_replace.

Reply

Marsh Posté le 08-01-2007 à 18:24:23    

J'ai cependant un autre petit problème. Lorsque j'ai plusieur fois l'occurence du mot recherché, il n'a pas l'air a voir ceux entre ceux des 2 extrimité.
 
Exemple:
 
MonMot  blablabla MonMot blablabla MonMot......
 
il ne va prendre que le premier et le dernier.

Reply

Marsh Posté le 08-01-2007 à 18:24:23   

Reply

Marsh Posté le 08-01-2007 à 19:38:53    

T'es sûr que t'as bien mis l'option U à ton masque comme recommandé par afbilou ?
 
Sinon donne un exemple pour voir, avec le code actuel de ta fonction.

Reply

Marsh Posté le 08-01-2007 à 20:04:11    

voila le bout de code    
    $expression = "#$debut(.*)$fin#U";  
    $retour = array();
    $data =array();
    preg_match_all($expression, $rapport, $data, PREG_SET_ORDER);
 print_r($data[0][1]);
 
Cependant, je viens de découvrir que ce n'est pas parce que j'ai une occurence entre 2 occurence, mais que j'ai une occurence de début, mais pas à la fin..............mmmmmmmmmmm je suis un peu bouche béé.......
 
Exemple:
 
MonMot blablabla.......  
 
quelqu'un à une idée ?

Reply

Marsh Posté le 08-01-2007 à 20:04:38    

oubliez le  
    $retour = array();
    $data =array();

Reply

Marsh Posté le 08-01-2007 à 20:39:49    

heu un split ??
http://fr.php.net/split
 
$Array = split("to",$str);

Reply

Marsh Posté le 08-01-2007 à 21:47:10    

Déjà c'est très très maladroit de mettre des variables comme tu le fais dans une regexp, parce que le $ veut dire fin de chaîne... Je suis pas sûr que le bordel soit interprété convenablement du coup.
 
Fais plutôt un truc du genre :
$expression = '#' . $debut . '(.*)' . $fin . '#Us'; (rajoute au moins l'option s, à moins que tu sois sûr que ton texte soit sur une ligne...)


Message édité par sielfried le 08-01-2007 à 21:47:29
Reply

Marsh Posté le 08-01-2007 à 22:04:59    

merci de ta suggestion. je vais faire le changement.
 
Je vous ré-explique mon plus gros prob:
Exemple:
 
To  
blablabla
blablabla
To
blablablabla
blalbalba
To
 
les 2 paragraphes de blablabla doivent être séparé, dans un tableau probable, parce que je veux décortiquer ces 2 paragraphe
 
voici ce que j'ai pour le moment:
 
$expression = '#'.$debut.'(.*)'.$fin.'#Us';  
 preg_match_all($expression, $rapport, $data, PREG_SET_ORDER);
   
 print_r($data[0][1]);
 
Ceci fonctionne, mais seulement pour la premiere section, c,est a dire:
To  
blablabla
blablabla
To
 
Help!
Merci

Reply

Marsh Posté le 08-01-2007 à 22:12:30    

Ok, c'est parce qu'une fois qu'il a matché une fois, le "To" final a été consommé, et comme ce "To" final est aussi le "To" de départ du prochain match, ça ne marche plus. ( [:pingouino] )
 
Essaie ça :
 

Code :
  1. $expression = '#'.$debut.'(.*)(?='.$fin.')#Us';

Reply

Marsh Posté le 08-01-2007 à 22:15:18    

et le split il répond à la question nan :o

Reply

Marsh Posté le 08-01-2007 à 22:18:24    

Ouais, mais ça marche pas si $debut et $fin sont différents, a priori.

Reply

Marsh Posté le 08-01-2007 à 22:18:57    

sielfried a écrit :

Ok, c'est parce qu'une fois qu'il a matché une fois, le "To" final a été consommé, et comme ce "To" final est aussi le "To" de départ du prochain match, ça ne marche plus. ( [:pingouino] )
 
Essaie ça :
 

Code :
  1. $expression = '#'.$debut.'(.*)(?='.$fin.')#Us';



 
 
Y a pas de changement...tout s'affiche de la même manière, c'est dire qu'il ne prends que le premier bloc

Reply

Marsh Posté le 08-01-2007 à 22:20:10    

gatsu35 a écrit :

et le split il répond à la question nan :o


 
Explique....je ne vois pas comment il règle le problème  :pt1cable:  
 

Reply

Marsh Posté le 08-01-2007 à 22:20:39    

Tu testes pas uniquement print_r($data[0][1]); au moins [:autobot]


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 08-01-2007 à 22:21:29    

dirty_harry a écrit :

Explique....je ne vois pas comment il règle le problème  :pt1cable:


 
Ce qu'il veut dire c'est que si $debut et $fin ont la même valeur comme dans ton exemple de "To", tu peux juste splitter ton texte sur "To" et ça te renvoie un tableau avec tout ce qu'il y a "autour", donc exactement ce que tu veux. [:spamafote]


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 08-01-2007 à 22:53:10    

sielfried a écrit :

Tu testes pas uniquement print_r($data[0][1]); au moins [:autobot]


 
 
non....mais j'essaie de parcourir le tableau avec un for ,mais je ne suis pas très familié.

Reply

Marsh Posté le 08-01-2007 à 23:22:22    

Code :
  1. $rapport = 'To  
  2. blablabla
  3. blablabla
  4. To
  5. blablablabla
  6. blalbalba
  7. To';
  8.  
  9. $debut = $fin = 'To';
  10. $expression = '#'.$debut.'(.*)(?='.$fin.')#Us';  
  11. preg_match_all($expression, $rapport, $data, PREG_SET_ORDER);
  12.  
  13. print_r($data);


 
J'ai bien les deux matchs.

Reply

Marsh Posté le 09-01-2007 à 00:37:16    

sielfried a écrit :

Code :
  1. $rapport = 'To  
  2. blablabla
  3. blablabla
  4. To
  5. blablablabla
  6. blalbalba
  7. To';
  8.  
  9. $debut = $fin = 'To';
  10. $expression = '#'.$debut.'(.*)(?='.$fin.')#Us';  
  11. preg_match_all($expression, $rapport, $data, PREG_SET_ORDER);
  12.  
  13. print_r($data);


 
c'est bon je les ai aussi  :bounce:  
 
Je remet le tout en place.....et je re test le tou demain.
 
Merci à vous  
 :hello:  
J'ai bien les deux matchs.


Reply

Marsh Posté le 09-01-2007 à 09:36:45    

que l'on ai cette config :  

Code :
  1. To 
  2. blablabla
  3. blablabla
  4. To
  5. blablablabla
  6. blalbalba
  7. To


ou encore  

Code :
  1. blablabla
  2. blablabla
  3. To
  4. blablablabla
  5. blalbalba

ou autre conjfiguration avec des To/to/tO/TO
un simple :  
$Array = split(#to#gi,$str); <== je me trompe peut etre un peu dans la regexp
aurait fait l'affaire :o

Reply

Marsh Posté le 01-03-2007 à 21:38:31    

Bonsoir à tous,
 
Excusez moi je débute et par curiosité j'essaye les différents codes donnés plus haut pour comprendre les mécanismes et j'ai besoin d'aide.
 
Supposons :
 

Code :
  1. $rapport = 'To_1 
  2. blablabla1
  3. blablabla1
  4. To
  5. blablablabla2
  6. blalbalba2
  7. To';
  8. $debut = $fin = 'To';
  9. $expression = '#'.$debut.'(.*)(?='.$fin.')#Us'; 
  10. preg_match_all($expression, $rapport, $data, PREG_SET_ORDER);
  11. print_r($data);


 
Comment spécifié le masque pour n'obtenir que la chaine comprise entre To et To et pas celle entre To_1 et To ?
 
D'avance merci. ::Ben

Reply

Marsh Posté le 01-03-2007 à 21:49:25    

Ton truc renvoie ça :

Code :
  1. Array
  2. (
  3.     [0] => Array
  4.         (
  5.             [0] => To_1 
  6. blablabla1
  7. blablabla1
  8.             [1] => _1 
  9. blablabla1
  10. blablabla1
  11.         )
  12.     [1] => Array
  13.         (
  14.             [0] => To
  15. blablablabla2
  16. blalbalba2
  17.             [1] =>
  18. blablablabla2
  19. blalbalba2
  20.         )
  21. )


 
Donc exactement ce que tu demandes (dans les sous-tableaux [1]). :spamafote:


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 01-03-2007 à 22:37:14    

cordiste a écrit :

Bonsoir à tous,

 

Excusez moi je débute et par curiosité j'essaye les différents codes donnés plus haut pour comprendre les mécanismes et j'ai besoin d'aide.

 

Supposons :

 
Code :
  1. $rapport = 'To_1 
  2. blablabla1
  3. blablabla1
  4. To
  5. blablablabla2
  6. blalbalba2
  7. To';
  8. $debut = $fin = 'To';
  9. $expression = '#'.$debut.'(.*)(?='.$fin.')#Us'; 
  10. preg_match_all($expression, $rapport, $data, PREG_SET_ORDER);
  11. print_r($data);
 

Comment spécifié le masque pour n'obtenir que la chaine comprise entre To et To et pas celle entre To_1 et To ?

 

D'avance merci. ::Ben


#(?<=\bTo\b)(.*)(?=\bTo\b)#Us

Message cité 1 fois
Message édité par afbilou le 01-03-2007 à 22:38:17
Reply

Marsh Posté le 02-03-2007 à 08:40:36    

Juste pour info
Sur freeBSD et pcre 7.0 j'ai constaté (et pas le seul) un bug qui fait parfoit des boucles inifinies dans les fonctions d'expression régulières (perso, ca m'est arrivé dans preg_match_all)
J'ai résolu le bug juste en retrogradant pcre en 6.x

Reply

Marsh Posté le 02-03-2007 à 11:21:06    

afbilou a écrit :

#(?<=\bTo\b)(.*)(?=\bTo\b)#Us


 
Merci Afbilou :bounce: Au plaisir de pouvoir te renvoyer la balle ::Ben

Reply

Marsh Posté le 02-03-2007 à 15:14:52    

Bon j'ai fait des progres et j'arrive à récupérer les données de l'array :)  
 
Par contre je bloque sur :
 

Code :
  1. <?php
  2. $rapport = 'To_A$ 
  3. blablabla1
  4. blablabla1
  5. To_A$
  6. blablablabla2
  7. blalbalba2
  8. To_A$_B';
  9. $debut = $fin = 'To_A$';
  10. $expression = '#(?<=\b'.$debut.'\b)(.*)(?=\b'.$fin.')#Us'; 
  11. preg_match_all($expression, $rapport, $data, PREG_SET_ORDER);
  12. print_r($data);
  13. ?>


 
Qui me renvoie un tableau vide peut être à cause du $.
 
Que me faut il modifier pour que mon array recoive les données tant attendues?
 
::Ben

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed