[PHP] reg ex j'y comprend rien !

reg ex j'y comprend rien ! [PHP] - PHP - Programmation

Marsh Posté le 02-09-2007 à 12:14:30    

Bonjour,
 
je voudrais récupérer dans une page tous ce qu'il y a entre 2 balises (rien de bien dur, pour ceux qui connaissent) mais voila, il m'en retourne plus et là je ne comprend pas !!
 
Voici mon code :

Code :
  1. <?PHP
  2.  $response =<<<icicfini
  3.  <html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="fr-FR">
  4. <head profile="http://gmpg.org/xfn/11">
  5. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  6. [...]
  7. <script type="text/javascript">
  8. <!--
  9. function bb2_addLoadEvent(func) {
  10. var oldonload = window.onload;
  11. if (typeof window.onload != 'function') {
  12.  window.onload = func;
  13. } else {
  14.  window.onload = function() {
  15.   oldonload();
  16.   func();
  17.  }
  18. }
  19. }
  20. bb2_addLoadEvent(function() {
  21. for ( i=0; i < document.forms.length; i++ ) {
  22.  if (document.forms[i].method == 'post') {
  23.   var myElement = document.createElement('input');
  24.   myElement.setAttribute('type', 'hidden');
  25.   myElement.name = 'bb2_screener_';
  26.   myElement.value = '1188573430 90.36.202.251';
  27.   document.forms[i].appendChild(myElement);
  28.  }
  29. }
  30. });
  31. // --></script>
  32.  <style type='text/css'>
  33. #headerimg h1 a, #headerimg h1 a:visited, #headerimg .description { color: #000000; }
  34. --></style>
  35. </head>
  36. <body>
  37. <div id="page">
  38. <div id="header">
  39. <div id="headerimg">
  40.  [données...]
  41. </div>
  42. </div>
  43. <hr />
  44. <div id="content" class="widecolumn">
  45.  <div class="navigation">
  46.   <div class="alignleft">[données...]</div>
  47.   <div class="alignright">[données...]</div>
  48.  </div>
  49.  <div class="post" id="post-1118"> <!-- je voudrais avoir tous ce que contient ce div-->
  50.   <h2>[données que je veux...]</h2>
  51.   <div class="entry">
  52.    <p>[données que je veux...]</p>
  53.    <p class="postmetadata alt">
  54.     <small>
  55.      [données que je veux...]
  56.     </small>
  57.    </p>
  58.   </div>
  59.  </div>
  60. <!-- You can start editing here. -->
  61.   <!-- If comments are closed. -->
  62.  <!-- <p class="nocomments">Les commentaires sont ferm&eacute;s.</p> -->
  63. </div>
  64. <hr />
  65. <div id="footer">
  66. <p>[données...]</div>
  67. </div>
  68. </body>
  69. </html>
  70. icicfini;
  71.  eregi( '<div[^>]*class="post"[^>]*>(.*)</div>', $response, $regs );
  72.  echo print_r($regs);
  73. ?>


 
voici ce que récupérer ce code :
 

Code :
  1. Array
  2. (
  3.     [0] => <div class="post" id="post-1118">
  4.   <h2>[données post...]</h2>
  5.   <div class="entry">
  6.    <p>[données entry...]</p>
  7.    <p class="postmetadata alt">
  8.     <small>
  9.      [données postmetadata...]
  10.     </small>
  11.    </p>
  12.   </div>
  13.  </div>
  14. </div>
  15. <hr />
  16. <div id="footer">
  17. <p>[données footer...]</div>
  18. </div>
  19.     [1] =>
  20.   <h2>[données post...]</h2>
  21.   <div class="entry">
  22.    <p>[données entry...]</p>
  23.    <p class="postmetadata alt">
  24.     <small>
  25.      [données postmetadata...]
  26.     </small>
  27.    </p>
  28.   </div>
  29.  </div>
  30. </div>
  31. <hr />
  32. <div id="footer">
  33. <p>[données footer...]</div>
  34. )
  35. 1


 
voici ceux qui est en trop :

Code :
  1. </div>
  2. <hr />
  3. <div id="footer">
  4. <p>[données footer...]</div>
  5. </div>


 
et je ne comprend pas pourquoi ?
je ne comprend pas non plus le fait qu'il y ai 2 entrées dans le tableau de retour alors que le code n'y est qu'une fois !
 
Voila, si vous pouvez m'aider,ça serait super sympas :)
 
SteF


---------------
Tout à commencé par un rêve...
Reply

Marsh Posté le 02-09-2007 à 12:14:30   

Reply

Marsh Posté le 02-09-2007 à 19:14:29    

Bonjour,
je suis loin d'etre un expert, mais:
 
1)Le fait que ce soit deux fois dans le tableau,c'est parce que l'index 0 corespond au masque complet capturé par la regexp.L'index 1 correspond a la premiere paire de parentheses capturantes (et ainsi de suite,si jamais tu as plusieurs paires de parentheses).
 
2°Le fait qu'il y ait un bout en trop, c'est parce que le comportement par défaut est 'greedy'. C'est à dire qu'il tente de capturer le plus gros morceau possible (greedy=gourmand en angliche). Pour remédier à ca, il faut spécifier l'option 'ungreedy'. En général,ca se fait en ajoutant la lettre U apres la regexp (exemple: $regexp='#REGEXP#U'; ).
 
Personellement,je me sert de preg_replace, pas de eregi, mais je pense que ca doit etre pareil.
 
En esperant que ca t'aide.
Bonne journée :)

Reply

Marsh Posté le 03-09-2007 à 10:43:01    

pour la partie 1 nikel,
pour la partie 2  je n'ai pas utilisé preg_replace car c'est pour faire un remplacement dans une chaine de caractères or moi je voudrais  récupérer une chaine de caractères (i pour insenssible à la case) ! d'où l'utilisation de eregi .
mais cela ne fonctionne pas comme je voudrais !!
j'ai essayé  

Code :
  1. preg_match( "/<div class=\"post\" id=\".*?\">(.*?)<\/div>/Uis", $response, $regs );


mais là jai la même chose qu'avant, plus de chose qu'il m'en faut !
 
le problème c'est que le pattern prend toujours le </div> le plus éloigné, il ne prend pas en compte la syntaxe html,  
mais comment faire pour lui dire de limiter sa recherche au </div> le plus proche ?
 
mon but est de faire un script qui permet de récupérer des articles à partir d'un flux RSS, et des les intégrer en base de données.
pour le flux RSS => OK,
vérification de présence de l'article en base de données => OK,
pour récupérer la page qui contient l'article => OK,
pour nettoyer la page, et ne ressortir que l'article => technique de la pierre => Echec ;)
pour mettre en base de données l'article => OK,


---------------
Tout à commencé par un rêve...
Reply

Marsh Posté le 03-09-2007 à 10:50:15    

Forcément si t'ajoutes à la fois le "?" après ".*" et l'option U, ben ça s'annule. [:petrus75]  
 
Choisis entre les deux.


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

Marsh Posté le 03-09-2007 à 11:06:34    

effectivement, en mettant ça :

Code :
  1. preg_match( "/<div class=\"post\" id=\".*\">(.*)<\/div>/Uis", $response, $regs );


il me retroune ça :

Code :
  1. <!-- je voudrais avoir tous ce que contient ce div-->
  2.             <h2>[données que je veux...]</h2>
  3.             <div class="entry">
  4.                 <p>[données que je veux...]</p>
  5.            
  6.                 <p class="postmetadata alt">
  7.                     <small>
  8.                         [données que je veux...]
  9.                     </small>
  10.                 </p>


qui est presque ce que je veux j'ai plus qu'à rajouter </div> pour finir comme il faut et c'est parfait !
 
n'y aurait-il pas un meilleur pattern pour faire une recherche sur ce type de chaine <div class="post" id="post-1118"> sachant que le "1118" est la seule chose qui peut changer soit en incrément, soit en décrément !


---------------
Tout à commencé par un rêve...
Reply

Marsh Posté le 03-09-2007 à 11:10:24    

Effectivement tu devrais pouvoir utiliser quelque chose comme ça je suppose.
 
(Mais c'est plus drôle, les regexp. [:dawa])


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

Marsh Posté le 03-09-2007 à 11:21:36    

lol, je parlais d'optimisation de ma regexp :)


---------------
Tout à commencé par un rêve...
Reply

Marsh Posté le 03-09-2007 à 12:20:32    

Disons que si c'est spéciquement pour du (x)html (ou du DOM en général) t'as des outils fait pour donc c'est con de se prendre le chou.
 
À mon avis là en termes de regexp va te falloir un truc récursif, bref quelque chose d'assez violent. -_-


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

Marsh Posté le 03-09-2007 à 15:24:44    

récursif pas la peine une page == un article
juste améliorer la regexp au cas où il y aurait besoin, simplification ou autre
pour le reste de mon truc, pas de soucis, je me débrouille ;)


---------------
Tout à commencé par un rêve...
Reply

Sujets relatifs:

Leave a Replay

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