REGEX - extraire une chaine

REGEX - extraire une chaine - PHP - Programmation

Marsh Posté le 03-02-2006 à 17:33:35    

bonjour
 
Apres plusieurs essais je n'arrive toujours pas a dire a mon pc
 
tu lis le fichier situé a l'URL (par ligne)
Tu extrais une chaine contenue
 
entre
<td colspan="9" height=40 align="left" class="tabletdgrisbord"><h2><font face="Verdana, Arial, Helvetica, sans-serif" size="4" color="#ff0000"><b>  APPLE</b>
 
et
</br>
 
et tu repetes autant de fois que tu retrouves le <td.... fini de </b>
Tu boucles et tu me le colle dans une variable de type tableau
 
C'est vraiment pas evident d'extraire APPLE et GROSBILL
 
voici mon brouillon php
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="fr" xml:lang="fr">
<head>
<title>Essai filtre grosbill</title>
</head>
<body>
<?php
$fp = fopen("http://www.grosbill.com/fr/ordinateurs/ordinateur-de-bureau/1-ordinateur-mini-pc/type.html", "r" );
while (!feof($fp)) {  
  $page .= fgets($fp, 4096);
}
$chainee = '<td colspan="9" height=40 align="left" class="tabletdgrisbord"><h2><font face="Verdana, Arial, Helvetica, sans-serif" size="4" color="#ff0000"><b>  APPLE</b>';
$marque = eregi("$chainee(.*)</b>", $page, $regs);  
fclose($fp);
?>
</body>
</html>
 
Toute aide de votre part sera la bienvenue...

Reply

Marsh Posté le 03-02-2006 à 17:33:35   

Reply

Marsh Posté le 03-02-2006 à 18:10:03    

Pour résumer ... tu as un fichier html qui ressemble a :
 

Code :
  1. <td colspan="9" height=40 align="left" class="tabletdgrisbord"><h2><font face="Verdana, Arial, Helvetica, sans-serif" size="4" color="#ff0000"><b>  APPLE</b>
  2. <td colspan="9" height=40 align="left" class="tabletdgrisbord"><h2><font face="Verdana, Arial, Helvetica, sans-serif" size="4" color="#ff0000"><b>  pouet</b>
  3. <td colspan="9" height=40 align="left" class="tabletdgrisbord"><h2><font face="Verdana, Arial, Helvetica, sans-serif" size="4" color="#ff0000"><b>  choucroute</b>
  4. <td colspan="9" height=40 align="left" class="tabletdgrisbord"><h2><font face="Verdana, Arial, Helvetica, sans-serif" size="4" color="#ff0000"><b>  caramel</b>


 
et tu veux recuperer dans un tableau apple pouet choucroute et caramel ?

Reply

Marsh Posté le 03-02-2006 à 18:21:47    

oui helas c'est ce que je me borne a essayer d'obtenir
dans n[1] n[2] etc..

Reply

Marsh Posté le 03-02-2006 à 18:23:20    

petite modif
 
Le resultat in fine que je souhaiterai est simplement
n[1] = choucroute
n[2] = taboulé

Reply

Marsh Posté le 03-02-2006 à 18:29:10    

$pattern = '#<td colspan="9" height=40 align="left" class="tabletdgrisbord"><h2><font face="Verdana, Arial, Helvetica, sans-serif" size="4" color="\#ff0000"><b> (.*)</b>#Ui';
 
preg_match_all($pattern , $text , $n);
 
$n[1][0] -> APPLE
$n[1][1] -> pouet
$n[1][2] -> choucroute
$n[1][3] -> caramel

Reply

Marsh Posté le 03-02-2006 à 18:30:04    

et count($n[1]); pour savoir combien d'element ont été trouvés evidemment ...

Reply

Marsh Posté le 03-02-2006 à 21:58:36    

afbilou t'es genial
je m'en va experimenter ceci tout de suite
 
a+

Reply

Marsh Posté le 03-02-2006 à 22:31:43    

je viens d'experimenter
et pb
 
voici le fichier php dont il est question avec la regex
 
<?php
echo '<h1>TITRE DE LA FENETRE BAREBONE GROSBILL</h1>';
$contenu_global = file('http://www.grosbill.com/fr/ordinateurs/ordinateur-de-bureau/1-ordinateur-mini-pc/type.html');
// $contenu_global = file_get_contents('http://www.grosbill.com/fr/ordinateurs/ordinateur-de-bureau/1-ordinateur-mini-pc/type.html');
$pattern = '#<td colspan="9" height=40 align="left" class="tabletdgrisbord"><h2><font face="Verdana, Arial, Helvetica, sans-serif" size="4" color="\#ff0000"><b> (.*)</b>#Ui';
preg_match_all($pattern , trim($contenu_global), $n);
echo $n[1][0];
echo $contenu_global;
?>
 
Merci pour votre aide.

Reply

Marsh Posté le 04-02-2006 à 02:17:15    

file retourne un tableau
 
utilise file_get_contents

Reply

Marsh Posté le 04-02-2006 à 13:23:03    

Tout fonctionne sauf l'extraction des données du tableau $n
qui contient le resultat de la regex
 
Il me trouve bien 2 elements : nickel
Mais pour les afficher j'ai bien essayé une boucle mais je l'ai supprimée puisque meme a la main je n'arrive pas a recuper les valeurs de $n[1][0]  et de  
$n[1][1]
 
Je suis a 2 doigts bon sang c'est prenant mais c rageant d'etre si près de la solution
 
 
<?
echo '<h1>LISTE PRODUITS BAREBONE GROSBILL</h1>';
$contenu_global = file_get_contents('http://www.grosbill.com/fr/ordinateurs/ordinateur-de-bureau/1-ordinateur-mini-pc/type.html');
$pattern = '#<td colspan="9" height=40 align="left" class="tabletdgrisbord"><h2><font face="Verdana, Arial, Helvetica, sans-serif" size="4" color="\#ff0000"><b> (.*)</b>#Ui';
preg_match_all($pattern , $contenu_global, $n);
$nb=count($n);
echo $nb." marques qui sont : <br>";
echo " Primo : ".$n[1][1];
?>

Reply

Marsh Posté le 04-02-2006 à 13:23:03   

Reply

Marsh Posté le 04-02-2006 à 13:31:21    

http://forum.hardware.fr/hardwaref [...] m#t1298788 :o


Message édité par afbilou le 04-02-2006 à 13:32:47
Reply

Marsh Posté le 04-02-2006 à 14:10:39    

Code :
  1. #<td colspan="9" height=40 align="left"  class="tabletdgrisbord"><h2><font face="Verdana, Arial, Helvetica, sans-serif" size="4" color="#ff0000"><b>  (.*)</b>#Ui

:o

Reply

Marsh Posté le 04-02-2006 à 14:47:19    

Merci a vous 2 de vous etre penché sur mon pb
 
non helas avec la premiere definition de $pattern ca me semble ok puisque in fine et meme si je n'arrive pas a extraire les valeurs --> le tableau contient 2
 
Avec la deuxieme definition de $pattern il manque le anti-slash  et me retourne une errur de parser --> de plus le tableaux tombe a zero donc aucune valeur
 
J'ai donc l'impression que le tableau se remplit mais sans valeur ou zero ou un string vide a chaque fois
 
Mais je continue a regarder les fonctions afferantes aux tableaux sur la doc officielle parceque je veux pas en rester la.
 
voici le resultat a l'ecran
 
2 marques qui sont :
Primo :
Array ( [0] => Array ( ) [1] => Array ( ) )
donc Array ( [0] => Array ( ) [1] => Array ( ) )
array(2) { [0]=> array(0) { } [1]=> array(0) { } } Array ( [0] => A
 
et le code en entier pour cet ecran
 
<html><head>
<title>essai regex</title>
</head>
<body>
<?
echo '<h1>MINIPC</h1>';
$contenu_global = file_get_contents('http://www.grosbill.com/fr/ordinateurs/ordinateur-de-bureau/1-ordinateur-mini-pc/type.html');
// $pattern = '#<td colspan="9" height=40 align="left" class="tabletdgrisbord"><h2><font face="Verdana, Arial, Helvetica, sans-serif" size="4" color="\#ff0000"><b> (.*)</b>#Ui';
$pattern = '#<td colspan="9" height=40 align="left"  class="tabletdgrisbord"><h2><font face="Verdana, Arial, Helvetica, sans-serif" size="4" color="\#ff0000"><b>  (.*)</b>#Ui';
preg_match_all($pattern , $contenu_global, $n);
$nb=count($n);
echo $nb." marques qui sont : <br>";
echo " Primo : <br>";
print_r($n);
echo "<br>";
print "donc ";
print_r(array_values ($n));
print "<br>";
var_dump($n);
print_r(array_values ($n));
?>
</body>
</html>

Reply

Marsh Posté le 04-02-2006 à 17:32:01    

Oula ... tu commences a m'enerver parce que j'ai l'impression ke tu ne veux pas reflechir.

Citation :

non helas avec la premiere definition de $pattern ca me semble ok puisque in fine et meme si je n'arrive pas a extraire les valeurs --> le tableau contient 2


preg_match_all te retourne un tableau a deux dimensions dans le 3eme parametres ... donc count($n) te retourne toujours 2 et c'est normal. Si tu lisais un peu la doc PHP de preg_match_all tu ne perdrais pas ton temps a te satisfaire du resultat '2' que tu obtiens et qui n'est pas le 2 que tu crois.
 

Citation :

Avec la deuxieme definition de $pattern il manque le anti-slash  et me retourne une errur de parser --> de plus le tableaux tombe a zero donc aucune valeur


Trop dur de le rajouter l'antislah ? Alors medite la solution ...

Code :
  1. #<td colspan="9" height=40 align="left"  class="tabletdgrisbord"><h2><font face="Verdana, Arial, Helvetica, sans-serif" size="4" color="\#ff0000"><b>  (.*)</b>#Ui


 

Citation :

J'ai donc l'impression que le tableau se remplit mais sans valeur ou zero ou un string vide a chaque fois


Comme je l'ai dit ... la regex n'etait pas adaptée a ton cas ... donc preg_match ne reconnaissait rien ...


Message édité par afbilou le 04-02-2006 à 17:32:51
Reply

Marsh Posté le 04-02-2006 à 18:09:16    

la mise en page du forum par en cacahuetes

Reply

Marsh Posté le 04-02-2006 à 21:01:57    

Je confirme la mise en page qui part en saucisson - avec mozilla
 
La regex n'est peut etre pas adaptée a mon cas et c meme fort possible.
J'avais l'impression de pouvoir coder proprement et court si je me mettai a utiliser les regex que plutot de programmer " a la akira67 " avec strpos  et compagnie - et des conditions et boucles a n'en plus finir
 
Cela dit meme si je suis le roi du code source plus long que les pros, j'ai pour souvenir d'arriver a chaque fois au résultat escompté.
 
Je voudrai ajouter que je regrette sincèrement d'avoir ouvert ce sujet puisque je suis arrivé a froisser un contributeur - Ce qui n'etait evidemment pas ce que je recherchais. C'est la premiere fois que ce genre de chose arrive et encore une fois toutes mes excuses.
 
Vu que les quelques mots de vocabulaire REGEX que j'avais besoin pour reduire de moitié mon code - je ne les aurais pas - je vais recoder " a la akira " en 25/30 lignes estimées de boucles et conditions et fonctions string.
 
Quant a l'anti-slash que t'avais ommis un peu plus haut c'etait pas une remarque de type 'nanananère' mais plutot pour te signifier que les deux solutions proposées etaient textuellement identique
 
L'essentiel etant que cela fonctionne -  
Et que le code - aussi long qu'il soit - me rencoie un tableau avec autant de truc rouge en gras de la classe tabletdgrisbord
 
tant pis si je suis ( pas ) passé loin de la solution. C'est decevant puisque cela ressemble au cas d'ecole et extrèmement précis.
Cela me fait penser que des fois a l'ecole c avec la solution que je venais a comprendre reelement le probleme donné.
 
Si la solution vous voulez la garder sous pretexe que je n'ouvre pas les bonnes pages de la notice - et bien gardez la je ne sais pas quoi vous dire.
 
Merci d'avoir passé un peu de temps à m'aider j'aurais quand meme appris des choses.

Reply

Marsh Posté le 04-02-2006 à 22:45:52    

:sweat:  :sweat:  :sweat:  :sweat:  :sweat:  :sweat:  :sweat:  :sweat:  :sweat:  :sweat:  
Mais la solution elle est dans ce post : http://forum.hardware.fr/hardwaref [...] m#t1299092
C'est la regex que tu dois utiliser  :sweat:  :sweat:  :sweat:  :sweat:  :sweat:  :sweat:  :sweat:

Reply

Marsh Posté le 05-02-2006 à 01:10:25    

La solution est dans le post. Mais en ma qualité d'eleve de la chose qu'on appelle expression regiliere je vous avoue que j'ai du mal a comprendre pourquoi le resultat dans $n[0][0] et $n[0][1] sont NULL ou vide ou ?? ailleurs ??
 
Une question :
j'ai experimenté avec ceci (sauf faute ici)
 
$pattern = '#tabletdgrisbord#Ui';
et me retournait dans mon tableau a deux dimensions
 
$n[0][0] --> tabletdgriscolor
$n[0][1] --> tabletdgriscolor
 
Nickel
 
Je me suis dit ok je vais re-essayer avec le pattern a mediter
et la  
 
resultat du tableau a mediter = NULL ou vide ou ???
 
Voila ou j'en suis. Je n'ai pas vraiment avancé.
 
CODE
 
// Affichage des constructeurs barebone grosbill
// On mets en variable toute la page concernée
$page_barebone_grosbill = file_get_contents('http://www.grosbill.com/fr/ordinateurs/ordinateur-de-bureau/1-ordinateur-mini-pc/type.html');
// On applique une regex afin de determiner si il y a des rubriques de type marque de produits
$pattern = '#<td colspan="9" height=40 align="left"  class="tabletdgrisbord"><h2><font face="Verdana, Arial, Helvetica, sans-serif" size="4" color="\#ff0000"><b>  (.*)</b>#Ui';
preg_match_all($pattern , $page_barebone_grosbill, $n);
// on affiche le premier element du tableau
echo $n[0][0];

Reply

Marsh Posté le 05-02-2006 à 01:27:30    

Je voudrai vous remercier a tous les deux et en particulier toi afbilou puisque je suis arrivé au résultat attendu
 
En guise de solution il m'aura fallu juste de supprimer l'espace avant la chaine (.*) de ^pattern et tout fonctionne impecc
 
Pour le bout de code ci dessous il me retourne enfin taboulé chaussette
 
Je suis aux anges...
 
// Affichage des constructeurs barebone grosbill
// On mets en variable toute la page concernée
$page_barebone_grosbill = file_get_contents('http://www.grosbill.com/fr/ordinateurs/ordinateur-de-bureau/1-ordinateur-mini-pc/type.html');
// On applique une regex afin de determiner si il y a des rubriques de type marque de produits
$pattern = '#<td colspan="9" height=40 align="left"  class="tabletdgrisbord"><h2><font face="Verdana, Arial, Helvetica, sans-serif" size="4" color="\#ff0000"><b>(.*)</b>#Ui';
preg_match_all($pattern , $page_barebone_grosbill, $n);
// on affiche le premier element du tableau
echo $n[0][1];

Reply

Marsh Posté le 05-02-2006 à 01:57:26    

je confirme, c'est 100% afbilou j'ai servi à rien moi :)

Reply

Marsh Posté le 06-02-2006 à 00:03:56    

A part a eviter la solution tableau (file(...))
 
a+

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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