Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1427 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  REGEX - extraire une chaine

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

REGEX - extraire une chaine

n°1298726
Akira67
Posté le 03-02-2006 à 17:33:35  profilanswer
 

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...

mood
Publicité
Posté le 03-02-2006 à 17:33:35  profilanswer
 

n°1298757
afbilou
pouet your life
Posté le 03-02-2006 à 18:10:03  profilanswer
 

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 ?

n°1298777
Akira67
Posté le 03-02-2006 à 18:21:47  profilanswer
 

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

n°1298778
Akira67
Posté le 03-02-2006 à 18:23:20  profilanswer
 

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

n°1298785
afbilou
pouet your life
Posté le 03-02-2006 à 18:29:10  profilanswer
 

$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

n°1298788
afbilou
pouet your life
Posté le 03-02-2006 à 18:30:04  profilanswer
 

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

n°1298898
Akira67
Posté le 03-02-2006 à 21:58:36  profilanswer
 

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

n°1298906
Akira67
Posté le 03-02-2006 à 22:31:43  profilanswer
 

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.

n°1298951
benamoubea​ch
tivuplai
Posté le 04-02-2006 à 02:17:15  profilanswer
 

file retourne un tableau
 
utilise file_get_contents

n°1298995
Akira67
Posté le 04-02-2006 à 13:23:03  profilanswer
 

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];
?>

mood
Publicité
Posté le 04-02-2006 à 13:23:03  profilanswer
 

n°1298996
afbilou
pouet your life
Posté le 04-02-2006 à 13:31:21  profilanswer
 

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


Message édité par afbilou le 04-02-2006 à 13:32:47
n°1299009
afbilou
pouet your life
Posté le 04-02-2006 à 14:10:39  profilanswer
 

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

n°1299035
Akira67
Posté le 04-02-2006 à 14:47:19  profilanswer
 

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>

n°1299092
afbilou
pouet your life
Posté le 04-02-2006 à 17:32:01  profilanswer
 

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
n°1299109
Profil sup​primé
Posté le 04-02-2006 à 18:09:16  answer
 

la mise en page du forum par en cacahuetes

n°1299164
Akira67
Posté le 04-02-2006 à 21:01:57  profilanswer
 

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.

n°1299194
afbilou
pouet your life
Posté le 04-02-2006 à 22:45:52  profilanswer
 

: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:

n°1299233
Akira67
Posté le 05-02-2006 à 01:10:25  profilanswer
 

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];

n°1299236
Akira67
Posté le 05-02-2006 à 01:27:30  profilanswer
 

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];

n°1299242
benamoubea​ch
tivuplai
Posté le 05-02-2006 à 01:57:26  profilanswer
 

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

n°1299550
Akira67
Posté le 06-02-2006 à 00:03:56  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  REGEX - extraire une chaine

 

Sujets relatifs
chaine caractere aidez moi svp........Batch Extraire les email d'un fichier txt
Boucle avec chaine vide : je comprends pas[BATCH] Détecter une chaine
VERIFIER CONTENU CHAINE CARACTEREChaine entré suivant plusieurs arguements
Extraire date creation d'un fichier en PHP[Java] Extraire une partie d'image
Supprimer le dernier caractere d'une chaine[SQL] REGEX dans mysql_query
Plus de sujets relatifs à : REGEX - extraire une chaine


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR