REGEX - extraire une chaine - PHP - Programmation
Marsh Posté le 03-02-2006 à 18:10:03
Pour résumer ... tu as un fichier html qui ressemble a :
Code :
|
et tu veux recuperer dans un tableau apple pouet choucroute et caramel ?
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..
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é
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
Marsh Posté le 03-02-2006 à 18:30:04
et count($n[1]); pour savoir combien d'element ont été trouvés evidemment ...
Marsh Posté le 03-02-2006 à 21:58:36
afbilou t'es genial
je m'en va experimenter ceci tout de suite
a+
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.
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];
?>
Marsh Posté le 04-02-2006 à 13:31:21
http://forum.hardware.fr/hardwaref [...] m#t1298788
Marsh Posté le 04-02-2006 à 14:10:39
Code :
|
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>
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 :
|
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 ...
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.
Marsh Posté le 04-02-2006 à 22:45:52
Mais la solution elle est dans ce post : http://forum.hardware.fr/hardwaref [...] m#t1299092
C'est la regex que tu dois utiliser
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];
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];
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...