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 :

preg_match ne balaye pas tout


Sujet :

Langage PHP

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 31
    Par défaut preg_match ne balaye pas tout
    Bonjour,

    J'utilise la fonction preg_match sur des milliers de page via une boucle for :

    elle se présente comme celle ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for($i=3;$i<=10;$i++) {
    $Page='http://www.monsite.fr/page=$i'; (ne pas s'occuper de l'erreur)
    }
    Pour chaque page , la fonction preg match doit normalement balayer 20 infos
    Lorsque que je le fait sur 1 ou 2 pages ca balaye tout , par contre lorsque j'essaye sur plusieurs page ca balaye 60% .

    Comment cela se fait t'il?

    N'hésitez pas à me demandez tous le code si il faut.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Bonjour,





    « Pour chaque page »

    Tu veux dire pour chaque valeur de $i ?



    « Lorsque que je le fais sur 1 ou 2 pages ça balaye tout »

    Tu veux dire avec
    for($i=3;$i<=6;$i++) ?



    « lorsque j'essaye sur plusieurs pages »

    Tu veux dire avec
    for($i=3;$i<=10;$i++) ?



    « ca balaye 60% »

    Tu veux dire que seulement 60 % du code source de la page récupérée, c’est à dire 60 % des caractères qui constituent ce code source, sont explorés ?
    Ou que 60 % des 20 infos, c’est à dire 12 seulement , sont captées ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 31
    Par défaut
    « Pour chaque page »

    Tu veux dire pour chaque valeur de $i ?
    Exactement



    « Lorsque que je le fais sur 1 ou 2 pages ça balaye tout »

    Tu veux dire avec
    for($i=3;$i<=6;$i++) ?
    Oui
    « lorsque j'essaye sur plusieurs pages »

    Tu veux dire avec
    for($i=3;$i<=10;$i++) ?
    C'est cela


    « ca balaye 60% »

    Tu veux dire que seulement 60 % du code source de la page récupérée, c’est à dire 60 % des caractères qui constituent ce code source, sont explorés ?
    Ou que 60 % des 20 infos, c’est à dire 12 seulement , sont captées ?
    Quand je dis 60 % c'est une moyenne :

    Par exemple : je recupére 100 page qui chacune d'elle contient 20 x 10 infos ( code_article , nom_article etc...)

    Je vais a chaque fois récupérer toutes les infos mais sur seulement 80 pages ... ou bien 80 pages qui récupére seulement 12 articles ... ca j'en ai aucune idée .

    n'hesite pas a me prévenir si tu ne comprends pas encore mon raisonnement . J'avoue je suis un peu difficile a suivre

  4. #4
    Membre Expert Avatar de nosferapti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 157
    Par défaut
    affiche le contenu de la page comme ça tu pourras vérifier qu'elles contiennent bien ce que tu attendais

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    J'avoue je suis un peu difficile a suivre
    Mais non, mais non. Pas plus que la moyenne.


    Je vais a chaque fois récupérer toutes les infos mais sur seulement 80 pages ... ou bien 80 pages qui récupére seulement 12 articles ... ca j'en ai aucune idée .
    Et bien je n’avais pas compris ça.
    Et il faut faire quelque chose pour en avoir une idée.
    À quoi sert de disposer d’un langage de programmation si c’est pour ne pas l’utiliser pour connaître la manière dont son exécution elle-mème se passe ?



    Il faut par exemple que tu lui fasses afficher le nombre d’articles trouvés dans chaque page, pour voir si ça varie, ou si la perte a lieu uniquement dans les denières pages ouvertes.



    Je suppose que la regex que tu utilises est aussi d’une certaine complexité, pour capter plusieurs types d’informations: une date de parution, un titre, un nom d’auteur, des références etc...

    Il faut que tu examines les articles pour déterminer ce qui est absolument identiques dans tous. Souvent c’est la date. Dès lors, tu crées une deuxième regex, avec une RE plus courte, plus simple, qui n’a pour but que de récupérer les dates des articles. Par exemple. Et tu compares dans chaque page si le nombr de dates trouvé est identique au nombre d’articles trouvés.

    J’ai compris récemment qu’il faut toujours procéder à ce genre de vérification pour récupérer des informations sur des pages web avec des regex. J’ai passé deux jours avant de comprendre la raison d’une erreur dans un code ; il s’agissait du fait que , malgré une limitation du caractère glouton d’un quantificateur + grâce à ?, ma regex captait le début d’un article puis elle allait jusqu’à la fin de l’article suivant, c’est à dire la date justement. Et comme les dates de ces deux articles étaient identiques sauf les heures , mais celles-ci encore très proches et semblables (01h47 et 01h17 ! ), j’ai mis longtemps à m’en apercevoir.
    Pourtant j’étais bien au courant du danger que représente l’utilisation de .+?



    Enfin bref, il faut se creuser les méninges, faire des essais, chercher, se démener. Pas rester devant une RE en se disant « mais pourquoi est-ce que ça peut bien ne pas marcher ?». Il faut faire parler l’exécution du programme.



    La mise au point d’une récupération d’infos sur des pages web est relativement long. Il faut analyser la structuration du code source des pages. Et il peut y avoir des variations peu fréquentes qui donnent des résultats inatendus. Le moindre signe peut faire basculer le fonctionnement dans un truc imprévu. il n’y a qu’en observant l’exécution sur un laps de temps suffisamment long qu’on finit par arriver à fignoler la regex au petit poil.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 31
    Par défaut
    Yép !
    Merci de vos réponses , ca m'a permis d'avancer dans la recherche de mon problème , et je suis sur que ca vient de là maintenant :

    En fait ca zappe des pages , j'ai recolté pour chaque article le numéro de la page ( $i ) , voici ce que j'obtiens dans un premier temps :

    Page count(Page)
    1 20
    10 20
    3 20
    6 20
    9 20

    En vidant la table et En relancant une deuxiéme fois j'obtiens cela:

    page count( page )
    1 20
    10 20
    2 20
    4 20
    5 20
    9 20


    On constate donc qu'il oublie des page ... j'avoue être complétement perdu vu qu'il ne zappe pas tout le temps les meme pages ...bizarre...

  7. #7
    Membre Expert Avatar de nosferapti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 157
    Par défaut
    Citation Envoyé par nosferapti Voir le message
    affiche le contenu de la page comme ça tu pourras vérifier qu'elles contiennent bien ce que tu attendais

  8. #8
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Quelle est l'info affichée par ton compteur ?
    Parce que s'il affiche le nombre de remplacements, ce ne sont peut-être pas les pages qui sont sautées, mais tout simplement la regex qui ne trouve rien dans certaines d'entre elles.

    Moralité : tu regardes celles qui sont absentes et tu fais tourner la regex dessus pour un premier diagnostic différentiel.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 31
    Par défaut
    nosferapti , je vais regarder ça .


    Le compteur affiche le nombre d'article recoltés sur la Page .

    [QUOTE]
    Moralité : tu regardes celles qui sont absentes et tu fais tourner la regex dessus pour un premier diagnostic différentiel. [/QUOTE
    Toutes les pages contiennent des infos , j'en suis sur et certains.


    J'ai oublié de précisé que j'utilisais : XMLHttpRequest .

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 31
    Par défaut
    Warning: mysql_connect() [function.mysql-connect]: User reeee already has more than 'max_user_connections' active connections in // on line 102
    Connexion à la base de données impossible !


    Voila la base du problème ......

    Peut t'on y remedier??


    merci d'avance

  11. #11
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Je croyais que quand tu parlais de pages, il s’agissait de pages de sites web. C’est dans le cadre de cette idée que j’ai écrit.

    Maintenant tu parles de connexion à une base de données. Est ce à dire que les pages dont il a été question au début sont des “pages“ issues d’une BDD ?

    On apprend aussi qu’il y a du JavaScript impliqué dans l’affaire, via ton indication que XMLHttpRequest est utilisé.




    C’est le morceau de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for($i=3;$i<=10;$i++) {
    $Page='http://www.monsite.fr/page=$i'; (ne pas s'occuper de l'erreur)
    }
    qui m’a induit dans l’idée que les pages étaient des pages web.

    Mais j’aurais dû me méfier car tu as annoncé ce bout de code par
    J'utilise la fonction preg_match sur des milliers de page via une boucle for :

    elle se présente comme celle ci :
    mais on n’y voit pas la fonction preg_match.

    Je croyais que la valeur de la variable $Page était ensuite utilisée comme adresse URL pour ouvrir une page web différente pour chaque $i.

    En fait il semble que le contenu analysé par preg_match soit obtenu d’une BDD.



    Ce serait mieux d’avoir de vraies explications dès le départ.



    Bon eh bien, vue la complexité de cette affaire non complétement expliquée dès le départ qui comporte des aspects pour lesquels je suis incompétent, je me déclare incapable d’aider plus.

  12. #12
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Citation Envoyé par queryz Voir le message
    Warning: mysql_connect() [function.mysql-connect]: User reeee already has more than 'max_user_connections' active connections in // on line 102
    Connexion à la base de données impossible !


    Voila la base du problème ......

    Peut t'on y remedier??


    merci d'avance
    Quel est le rôle de la BDD dans tes traitements ?
    Ceci dit, si à chaque page tu te connecte à ta base (ou pire, à chaque occurrence trouvée), ça va forcément faire un goulot d'étranglement.

    Une note intéressante sur cette page : http://php.net/manual/fr/features.pe...onnections.php

    Notez que les connexions persistantes ont quelques inconvénients si vous hébergez une base de données dont le nombre maximal de connexion risque d'être atteint par les connexions persistantes. Si votre base de données accepte jusqu'à 16 connexions simultanées et que 17 processus essaient de se connecter, le dernier restera sur la touche. S'il y a des erreurs dans les scripts qui ne permettent pas de fermer la connexion (par exemple, une boucle infinie), votre serveur sera rapidement engorgé. Vérifiez la documentation de votre base de données pour savoir comment elle traite les connexions inactives ou abandonnées.
    Ca peut peut-être aider...

  13. #13
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Quel est le rôle de la BDD dans tes traitements ?
    Ah, ça me rassure. Si même s.n.a.f.u. ne saisit pas tout bien, c’est qu’il y a effectivement une insuffisance d’explication à la base, ce n’est pas moi qui serait le seul à être à la ramasse







    Je pense que la citation donnée par s.n.a.f.u. est tout à fait pertinente. il me paraît évident que tu dois ouvrir des connexions et ne pas les refermer. C’est un travers fréquent de développeurs qui n’ont pas un grand souci de la rigueur. En Python quand je récupère une page web, je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sock = urllib.urlopen(url)
    ch = sock.read()
    sock.close()
    mais j’ai vu pas mal de codes dans lesquels il n’y a pas l’instruction sock.close(), ou pareillement pas fichier.close() quand il s’agit de fichier. Ce n’est pas étonnant qu’il y ait des conséquences à ce genre de négligence.



    S'il y a des erreurs dans les scripts qui ne permettent pas de fermer la connexion......
    D’où l’intérêt de prévoir que des erreurs peuvent se produire et de mettre dans le code une gestion des erreurs. Par rigueur, là aussi.

Discussions similaires

  1. Réponses: 7
    Dernier message: 23/10/2005, 22h38
  2. [SQL-Server] [MySQL] Le mssql_fetch_array() n'affiche pas tout
    Par PoZZyX dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 30/09/2005, 10h50
  3. [XSL]Comment faire ceci ?? Mon for-each n'affiche pas tout !
    Par Devil666 dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 27/07/2005, 15h04
  4. [Débutant XML] Pas tout comprendre
    Par lenoir_franck dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 31/05/2005, 15h18
  5. Réponses: 3
    Dernier message: 16/04/2004, 16h51

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