preg_match_all - PHP - Programmation
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
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.
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;
}
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 ...
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.
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
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.
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.
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 ?
Marsh Posté le 08-01-2007 à 20:39:49
heu un split ??
http://fr.php.net/split
$Array = split("to",$str);
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...)
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
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. ( )
Essaie ça :
Code :
|
Marsh Posté le 08-01-2007 à 22:15:18
ReplyMarsh Posté le 08-01-2007 à 22:18:24
Ouais, mais ça marche pas si $debut et $fin sont différents, a priori.
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. (
|
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
Marsh Posté le 08-01-2007 à 22:20:10
gatsu35 a écrit : et le split il répond à la question nan |
Explique....je ne vois pas comment il règle le problème
Marsh Posté le 08-01-2007 à 22:20:39
Tu testes pas uniquement print_r($data[0][1]); au moins
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 |
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.
Marsh Posté le 08-01-2007 à 22:53:10
sielfried a écrit : Tu testes pas uniquement print_r($data[0][1]); au moins |
non....mais j'essaie de parcourir le tableau avec un for ,mais je ne suis pas très familié.
Marsh Posté le 08-01-2007 à 23:22:22
Code :
|
J'ai bien les deux matchs.
Marsh Posté le 09-01-2007 à 00:37:16
sielfried a écrit :
|
Marsh Posté le 09-01-2007 à 09:36:45
que l'on ai cette config :
Code :
|
ou encore
Code :
|
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
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 :
|
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
Marsh Posté le 01-03-2007 à 21:49:25
Ton truc renvoie ça :
Code :
|
Donc exactement ce que tu demandes (dans les sous-tableaux [1]).
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 :
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
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
Marsh Posté le 02-03-2007 à 11:21:06
afbilou a écrit : #(?<=\bTo\b)(.*)(?=\bTo\b)#Us |
Merci Afbilou Au plaisir de pouvoir te renvoyer la balle ::Ben
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 :
|
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
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