IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Petit soucis avec Preg_match


Sujet :

Langage PHP

  1. #1
    Membre très actif
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Par défaut Petit soucis avec Preg_match
    Bonjour à tous,
    Afin de poursuivre mon petit projet, j'ai besoin de récupérer une valeur affiché sur une page de l'intranet de mon entreprise pour l'afficher sur ma mage et effectuer un calcul avec cette valeur par la suite.

    Pour commander, voici un extrait du code de la page intranet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <td class="cell_data cell2">CET</td><td class="cell_label cell3">Dernier</td><td class="cell_data cell4"><strong>4525.12</strong><span class="pricetime">04 Jan 2016 14:50</span></td>
    J'ai besoin de récupérer le chiffre [i]4525.12[i].
    Pour ce faire, j'ai donc voulu utiliser le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?php $sitefutcac = file_get_contents("http://collaboratif/sites/Intranet/SitePages/intranet_avotreservice.aspx");
    preg_match('#Dernier</td><td class="cell_data cell4"><strong>(.*?)</strong>>#', $sitefutcac, $cotefutcac);
     
    print_r($cotefutcac[1]);
    ?>
    Malheureusement rien ne s'affiche.

    Pour essayer, j'ai essayé le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php echo $sitefutcac;?>
    La page intranet s'affiche comme attendu.

    Je suppose qu'il doit encore s'agit d'une petite erreur toute bête, mais je ne trouve pas.

    Quelqu'un aurait une idée ?
    Merci d'avance.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Tu as mis ">>" dans ton expression.

    Sinon, les expressions régulières ne sont pas idéales pour lire du HTML. Il vaut mieux utiliser des classes spécialisés comme Domdocument ou SimpleXML.
    Et pour le fond du sujet, le chiffre affiché sur l'intranet doit provenir de quelque part, je ne pense pas qu'il soit mis à la main.
    Il serait plus logique soit d'aller le lire directement à sa source, soit d'avoir une interface pour transmettre la valeur d'un site à l'autre.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre très actif
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Par défaut
    Bonjour Sabotage et merci de t'intéresser à mon problème.
    J'ai corrigé mon code comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match('#Dernier</td><td class="cell_data cell4"><strong>(.*?)</strong>#', $sitefutcac, $cotefutcac);
    Mais rien n'y fait, il ne semble toujours pas fonctionner.
    Je n'y connais pas grand chose en programmation je me dépatrouille tout seul en regardant les exemples sur le net. je ne sais donc pas comment utiliser des classes spécialisés comme Domdocument ou SimpleXML. Aurais tu un exemple à me proposer ?

    Le chiffre que je récupère est effectivement issus d'un calcul à partir de données entrées par les utilisateurs d'un autre service. J'avais essayé de creuser de ce coté là, mais c'est une usine à gaz pour dépatouiller les tenants et les aboutissants. D'autant plus que la personne qui avait fait ces codes n'est plus là.
    Honnêtement, le plus simple est de récupérer la valeur directement sur la page web.
    En réalité il y a plusieurs valeurs sur différentes pages, mais seule celle-ci me bloque.

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Ca donnerait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $doc = new DOMDocument();
    $doc->loadHTMLFile('http://collaboratif/sites/Intranet/SitePages/intranet_avotreservice.aspx');
    $xpath = new DOMXpath($doc);
    $elements = $xpath->query('//td[@class="cell_data cell4"]/strong');
    echo $elements[0]->nodeValue;
    Je suppose que le problème de ton expression regulière est que le vraie code HTML n'est pas sur une seule ligne.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre très actif
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Par défaut
    Merci pour cet exemple !
    Une petite question : je ne comprends pas vraiment la syntaxe de ton code pour sélectionner l'information que je veux extraire de la page :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $xpath->query('//td[@class="cell_data cell4"]/strong');
    Dans le code que j'utilisais, j'utilisais (.*?).
    L'info que je dois extraire est exactement placé après le code suivant Dernier</td><td class="cell_data cell4"><strong>
    et arrêter juste à la balise </strong>

    Je ne comprends pas non plus pourquoi tu indiques [@ Qu'est ce que ça représente ?

    Encore merci de t'intéresser à ma question et merci d'avance pour tes lumières

  6. #6
    Membre très actif
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Par défaut
    J'ai une autre petite question :
    Par exemple, dans une autre page, je dois récupérer une valeur derrière le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <span source="lightstreamer" table="Shm_FullArea_ctl00_PushTable" item="C1DE000CW40VT7" field="bid">
    Le truc c'est la référence DE000CW40VT7 n'est pas fixe mais provient d'un champs utilisateur.
    Ce code est déjà dans une variable PHP ($CodePos1) que j'utilise ailleurs dans mon code.

    Je pensais faire un code du genre suivant, mais bien évidement ça le fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match('<span source="lightstreamer" table="Shm_FullArea_ctl00_PushTable" item="C1' echo $CodePos1; ' field="bid">(.*?)</span>#', $sitebeta, $cotebeta);
    Quelqu'un aurait une idée ?
    Sans doutes qu'avec la solution de me propose Sabotage, ça sera plus simple ?

  7. #7
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    C'est une syntaxe XPATH, ce n'est pas une expression régulière.

    Pour ton deuxième exemple, on cherche une balise "span" qui contient l'attribut "item" avec la valeur "C1DE000CW40VT7"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $elements = $xpath->query('//span[@item="' . $CodePos1 . '"');
    echo $elements->item(0)->nodeValue;
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  8. #8
    Membre très actif
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Par défaut
    Merci pour tes lumières,
    J'ai légèrement adapté ton code pour créer une variable qui reprenne $CodePos1 avec C1 en préfixe.
    Ce qui donne le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	$doc = new DOMDocument();
    	$doc->loadHTMLFile('http://10.10.1.20/salaries/login/planning/');
    	$xpath = new DOMXpath($doc);
    	$CodePos1Bis = "C1".$CodePos1;
    	$elements = $xpath->query('//span[@item="' . $CodePos1Bis . '"');
    	echo $elements->item(0)->nodeValue;
    J'ai donc testé ton code, mais j'ai les erreurs suivantes :
    Warning: DOMXPath::query(): Invalid predicate in /home/u164042793/public_html/doubleg/turbo.php on line 178
    Warning: DOMXPath::query(): Invalid expression in /home/u164042793/public_html/doubleg/turbo.php on line 178
    Fatal error: Call to a member function item() on a non-object in /home/u164042793/public_html/doubleg/turbo.php on line 179

    Les lignes 178 et 179 correspondent aux code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $elements = $xpath->query('//span[@item="' . $CodePos1Bis . '"');
    echo $elements->item(0)->nodeValue;
    Concernant ton premier code, je ne l'ai pas encore testé, je viens de me rendre compte que j'ai d'autre soucis sur la page cible.

  9. #9
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    3 020
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 3 020
    Par défaut
    Tu as oublié le crochet fermant du prédicat.

  10. #10
    Membre très actif
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Par défaut
    Effectivement avec ce code, ça fonctionne mieux
    Merci !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $elements = $xpath->query('//span[@item="' . $CodePos1Bis . '"]');

  11. #11
    Membre très actif
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Par défaut
    Ce code fonctionne, mais j'ai cependant un léger soucis :
    Voici le code de la page "cible" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <span source="lightstreamer" table="Shm_FullArea_ctl00_PushTable" item="C1DE000CW40VT7" field="bid">3,13 EUR</span>
    J'ai besoin de récupérer la valeur 3,13 pour effectuer des calculs par la suite.
    Je sais convertir 3,13 en 3.13 pour que le calcul soit possible, aucun soucis de ce côté là.
    Je pensais aussi "tronquer" la variable pour ne récupérer que les chiffres en utilisant le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	$abc= $elements->item(0)->nodeValue;
    	$PrixCurPos1 = explode(" ",$abc);
    Malheureusement ça ne fonctionne pas parfaitement.En effet, je vois afficher 3,13Â EUR
    Si je fais un essais en mettant juste echo $elements, le code m'affiche toujours la même chose : 3,13Â EUR
    Savez vous pourquoi ? et comment remédier à ce petit soucis ?

Discussions similaires

  1. petit soucis avec mon graveur
    Par Vador dans le forum Périphériques
    Réponses: 8
    Dernier message: 02/11/2005, 15h58
  2. petit soucis avec les listes
    Par Death83 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 03/09/2005, 11h08
  3. Petit souci avec clause where
    Par ybruant dans le forum SQL
    Réponses: 1
    Dernier message: 21/07/2005, 23h10
  4. petit souci avec des variables avec des fonctions psql
    Par dust62 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 02/04/2005, 14h45
  5. [DEBUTANT] petits soucis avec un prgm de chat
    Par LechucK dans le forum MFC
    Réponses: 8
    Dernier message: 19/01/2004, 17h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo