Problème avec preg_match_all

Bountard Messages postés 15 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 13 juillet 2005 - 12 juil. 2005 à 11:28
Bountard Messages postés 15 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 13 juillet 2005 - 12 juil. 2005 à 12:14
Salut à tous,

j'ai un petit problème avec l'utilisation de preg_match_all.

Pour faire plus simple voila mon bout de code d'essai :

<?php

$html = '<tr> <td> un </td> <td> deux
</td> </tr> <tr> <td> un bis </td>
</tr>';

preg_match_all("/(<td>)(.*)(<\/td>)/", $html, $matches, PREG_SET_ORDER);

$compteur = 0;

foreach ($matches as $val) {

$compteur = $compteur+1;

echo 'Matched '. $compteur. ' : ' . $val[0] . '';

}

echo 'Compteur = '.$compteur;

?>


Il m'affiche : Matched 1 : un deux un bis

Puis : Compteur = 1



Donc je me rends compte sans trop de mal en explorant le code source de
la page de retour d'ailleurs, que preg_match_all cherche dans la chaîne
de caractère le dernier et non le premier </td> pour délimiter
mes recherches comme je le souhaiterais.

Comment faire pour compter le nombre de <td> ?

Merci pour votre aide je galère depuis quelques heures dessus.
A voir également:

8 réponses

malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
12 juil. 2005 à 11:39
Si tu dois te limiter a des <td> </td>, preg_match n'est pas forcement le plus pratique.

strpos () prend un offset : il te trouvera le 1er <td>, et te
retourne sa position. Tu peux l'appeler recursivement avec la position
comme offset, popur poursuivre ta recherche, et ainsi de suite jusqu'a
la fin : tu auras ton nombre de <td>.

Apres j'ai pas bien compris ce que tu voulais faire exactement, alors...
0
Bountard Messages postés 15 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 13 juillet 2005
12 juil. 2005 à 11:44
Je veux compter le nombre de '<td>' dans ma chaîne de caractère,
plus exactement le nombre de '<td> ..... </td>'.
0
Bountard Messages postés 15 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 13 juillet 2005
12 juil. 2005 à 12:05
Par contre un petit problème avec strpos(), je ne sais quelle condition mettre pour arrêter la récurrence.



Par exemple un code du type :



$pos = 0;

$compteur = 0;

while ( ......) {

$pos = strpos($html,'<td>',$pos');

$compteur = compteur +1 ;

}


Si quelqu'un pouvait m'aider pour la condition d'arrêt, merci.
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
12 juil. 2005 à 12:09
false, tu l'arretes quand il renvoie false.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
12 juil. 2005 à 12:10
attention pas 0, hein, utilise l'operateur de comparaison sur le type : === false
0
Bountard Messages postés 15 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 13 juillet 2005
12 juil. 2005 à 12:10
J'ai résolu mon problème comme cela :



$pos = 1;

$compteur = 0;

while ($pos >= 1) {

$pos = strpos($html, '<td>', $pos+4);

if($pos >1) { $compteur $compteur + 1; }

}

?>
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
12 juil. 2005 à 12:11
Mais en effet sio tui veux tester le nombre d'occurences de <td>...</td>, le mieux est une expression reguliere, et donc ton preg_match_all (je ne l'ai pas testee encore, ton code, pas eu le temps desole)
0
Bountard Messages postés 15 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 13 juillet 2005
12 juil. 2005 à 12:14
Bon j'ai mon compteur, par contre, je ne sais toujours pas comment faire marcher preg_match_all comme je le souhaite.

J'aimerais qu'il tronque la chaîne a chaque couple <td>
</td>, et non au premier <td> et le dernier </td> de
la chaîne.
0