[RegEx] extraire donné entre un div ?

extraire donné entre un div ? [RegEx] - PHP - Programmation

Marsh Posté le 08-05-2008 à 01:08:26    

Bonjour,
 
 
Dans une variable est stocké une page html avec ses balises sans les retours chariots.
Je n'aurais besoin que des données entre la balise <div class="Pad1Color2"> et <div>
 
Je pensais utilisé le pattern suivant :  
 

Code :
  1. $matches = array();
  2. $pattern = "#(<div class=)?(Pad1Color2)?(> )?(</div> )#";
  3. if (preg_match ($pattern , $string, $matches ))
  4. echo "trouvé";
  5. else
  6. echo "pas TROUVE";


 
 
La fonction retourne true => echo "trouvé";
mais par contre le tableau marches me retourne :  
 

Array
(
    [0] => >
    [1] =>  
    [2] =>  
    [3] => >
    [4] =>  
)


 
Bref, je pense qu'en fin de compte mon pattern n'est pas bon.. Dans le pattern, j'ai mis des ? parce que les doubles quotes " ne passe pas.

Reply

Marsh Posté le 08-05-2008 à 01:08:26   

Reply

Marsh Posté le 08-05-2008 à 01:53:51    

yop,

 

j'suis pas trop doué pour ces troucs mais ça devrait marcher (enfin si j'ai bien compris ce que tu voulais faire) :

 
Code :
  1. $string = '<div class="Pad1Color2">la castafiore </div> broleke <div class="Pad1Color2">un patapouf !!!</div>';
  2. $matches = array();
  3. $pattern = "#<div class=\"Pad1Color2\">([^<]*)</div>#";
  4. if (preg_match_all($pattern , $string, $matches ))
  5. echo "Trouved<br />";
  6. else
  7. echo "Pas trouved<br />";
  8. print_r($matches);
 


le "?" dit que le caractère le précédent peut être présent ou non.

 

Dans le pattern, les " sont échappés par un \ => \" (Il faut les échapper parce que ta chaine est entourée de " aussi)

 

<div class="Pad1Color2"> est le début du pattern (où il faut échapper les caractères spéciaux s'il y en a).
</div> est la fin du pattern.

 

Ce qu'on veut capturer, on le met entre ()
On veut avoir tout ce qui se trouve entre les deux balises. On commence après la première balise. On doit s'arrêter avant la deuxième balise (</div> )
Donc on va dire qu'on va prendre tous les caractères différents de "<" (qui indiquerait le début de </div> ).
Bon, ce serait mieux de dire de s'arrêter dès qu'il trouve "</div>" mais je ne sais pas comment faire :p

 

Bref, ici on veut n'importe quoi sauf "<" ce qui s'écrit [^<]*

 

les caractères entre [] sont autorisés sauf si précédés d'un ^
* dit que les caractères permis peuvent apparaitre un nombre quelconque de fois.

 

voilou, mais y a surement mieux :)


Message édité par art_dupond le 08-05-2008 à 12:23:34

---------------
oui oui
Reply

Marsh Posté le 08-05-2008 à 09:21:58    

/<div class="Pad1Color2">(.*?)</div>/


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

Marsh Posté le 08-05-2008 à 10:16:07    

On ne parse pas du HTML avec des regexp [:pingouino]
 
http://simplehtmldom.sourceforge.net/


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 08-05-2008 à 10:58:05    

D'autant que ma regexp va chier avec des div imbriqués. [:petrus75]
 
Faudrait de la récursion, mais bon ouais, autant le faire avec DOM de toute façon. Surtout avec cette bibli, que je connaissais pas tiens, ça a l'air particulièrement pratique/concis tout ça, pas comme le truc de base. :o

Message cité 1 fois
Message édité par sielfried le 08-05-2008 à 10:58:35

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

Marsh Posté le 08-05-2008 à 11:04:06    

sielfried a écrit :

D'autant que ma regexp va chier avec des div imbriqués. [:petrus75]


Ben oui, comme quasiment toutes les regexp, et quand des fonctionalités récursives sont ajoutées aux regexp (e.g. Perl), ça devient imbitable et au final on gagne pas grand chose sur un parseur propre, à part le fait que personne ne puisse maintenir le truc [:petrus75]
 
C'est comme le BBCode, vous remarquerez que dans 99.9% des forums il est trivialement possible de flinguer le BBCode et de sortir des trucs tout pêtés, parce que le bbcode est parsé/transformé à coup de regexp au lieu de faire ça proprement [:spamafote]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Sujets relatifs:

Leave a Replay

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