Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2445 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  preg_match_all

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

preg_match_all

n°1500442
dirty_harr​y
Posté le 08-01-2007 à 17:12:56  profilanswer
 

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

mood
Publicité
Posté le 08-01-2007 à 17:12:56  profilanswer
 

n°1500457
afbilou
pouet your life
Posté le 08-01-2007 à 17:39:39  profilanswer
 

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

n°1500460
dirty_harr​y
Posté le 08-01-2007 à 17:42:32  profilanswer
 

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

n°1500462
afbilou
pouet your life
Posté le 08-01-2007 à 17:46:18  profilanswer
 

xD
print_r($data);

n°1500463
dirty_harr​y
Posté le 08-01-2007 à 17:46:31  profilanswer
 

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;
}

n°1500464
afbilou
pouet your life
Posté le 08-01-2007 à 17:50:54  profilanswer
 

$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 ...

n°1500465
dirty_harr​y
Posté le 08-01-2007 à 17:55:26  profilanswer
 

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.
 

n°1500470
dirty_harr​y
Posté le 08-01-2007 à 18:07:47  profilanswer
 

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  
 

n°1500471
dirty_harr​y
Posté le 08-01-2007 à 18:11:48  profilanswer
 

Probleme réglé avec un str_replace.

n°1500475
dirty_harr​y
Posté le 08-01-2007 à 18:24:23  profilanswer
 

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.

mood
Publicité
Posté le 08-01-2007 à 18:24:23  profilanswer
 

n°1500514
sielfried
Posté le 08-01-2007 à 19:38:53  profilanswer
 

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.

n°1500520
dirty_harr​y
Posté le 08-01-2007 à 20:04:11  profilanswer
 

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 ?

n°1500521
dirty_harr​y
Posté le 08-01-2007 à 20:04:38  profilanswer
 

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

n°1500527
gatsu35
Blablaté par Harko
Posté le 08-01-2007 à 20:39:49  profilanswer
 

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

n°1500545
sielfried
Posté le 08-01-2007 à 21:47:10  profilanswer
 

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
n°1500551
dirty_harr​y
Posté le 08-01-2007 à 22:04:59  profilanswer
 

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

n°1500554
sielfried
Posté le 08-01-2007 à 22:12:30  profilanswer
 

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';

n°1500556
gatsu35
Blablaté par Harko
Posté le 08-01-2007 à 22:15:18  profilanswer
 

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

n°1500557
sielfried
Posté le 08-01-2007 à 22:18:24  profilanswer
 

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

n°1500558
dirty_harr​y
Posté le 08-01-2007 à 22:18:57  profilanswer
 

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

n°1500559
dirty_harr​y
Posté le 08-01-2007 à 22:20:10  profilanswer
 

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:  
 

n°1500560
sielfried
Posté le 08-01-2007 à 22:20:39  profilanswer
 

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


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
n°1500561
sielfried
Posté le 08-01-2007 à 22:21:29  profilanswer
 

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
n°1500572
dirty_harr​y
Posté le 08-01-2007 à 22:53:10  profilanswer
 

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é.

n°1500583
sielfried
Posté le 08-01-2007 à 23:22:22  profilanswer
 

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.

n°1500601
dirty_harr​y
Posté le 09-01-2007 à 00:37:16  profilanswer
 

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.


n°1500641
gatsu35
Blablaté par Harko
Posté le 09-01-2007 à 09:36:45  profilanswer
 

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

n°1522550
cordiste
Posté le 01-03-2007 à 21:38:31  profilanswer
 

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

n°1522557
sielfried
Posté le 01-03-2007 à 21:49:25  profilanswer
 

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
n°1522571
afbilou
pouet your life
Posté le 01-03-2007 à 22:37:14  profilanswer
 

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
n°1522641
nORKy
Grmmph...
Posté le 02-03-2007 à 08:40:36  profilanswer
 

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

n°1522741
cordiste
Posté le 02-03-2007 à 11:21:06  profilanswer
 

afbilou a écrit :

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


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

n°1522895
cordiste
Posté le 02-03-2007 à 15:14:52  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  preg_match_all

 

Sujets relatifs
preg et retour chariotprob preg_replace
regex et preg_replace()[PHP] Preg_Match() syntaxe regex pcre
Preg_match_allpreg_match sur une balise a
Echapper un mot avec preg_matchProb preg_match() - résolu
Qui maitrise la fonction "preg_match" ?[PHP] utlisation de la fonction preg_match
Plus de sujets relatifs à : preg_match_all


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)