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 :

Analyse de code html [RegEx]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de xess91
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 408
    Par défaut Analyse de code html
    Bonjour à tous,

    j'ai cette regex et elle ne marche biensur pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $check = '#<p><img height="25" src="images/barre_resultat_480\.gif" width="480" border="0"></p>(.*)<table cellpadding="2" cellspacing="0" width="475" border="0">#';
    Il ne me semble pas avoir oublié un caractère d'échappement !

    Au cas ou j'ai vraiment merdé, j'avoue que les "regex" ne sont pas vraiment même pas du tout mon fort et que m'on intention ne soit pas clair:

    le but est de capturer les elements compris entre:

    <p><img height="25" src="images/barre_resultat_480\.gif" width="480" border="0"></p>

    et

    <table cellpadding="2" cellspacing="0" width="475" border="0">

    Edit:

    J'ai quelque peut modifié la regex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    for($i = 1; $i < 42; $i++)
    	{
    	$check = '/<p><img height="25" src="images/barre_resultat_480\.gif" width="480" border="0"></p>(.*?)<table cellpadding="2" cellspacing="0" width="475" border="0">/';
     
    	$url = "http://www.oste.com/home.php?codePage=".$i;
    	if(preg_match($check, file_get_contents($url), $liste))
    		{
    		echo $url.'<br />';
    		echo $liste[1];
    		}
    	}
    et mon code erreur est le suivant:

    Warning: preg_match() [function.preg-match]: Unknown modifier 'b' in /homez.145/creationmo/www/neufoudoccaz/pompage.php on line 7

    Merci à tous pour vos réponses.

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Il faut choisir un autre délimiteur car le / apparaît dans votre motif. A moins de l'échapper, mais c'est moins lisible.

    Et vous aurez probablement besoin des options U (pour la non-gourmandise) et s (pour que le métacaractère . inclut les nouvelles lignes).

  3. #3
    Membre éclairé Avatar de xess91
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 408
    Par défaut
    Merci Julp mais j'ai rien compris ! lol.

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $check = '/<p><img height="25" src="images/barre_resultat_480\.gif" width="480" border="0"></p>(.*?)<table cellpadding="2" cellspacing="0" width="475" border="0">/';
    1. Le premier / marque le début du motif
    2. Le deuxième / : erreur, est attendue la fin du motif, où l'on précise normalement les options de l'expression (insensibilité à la casse par exemple). C'est là qu'une erreur est signalée : l'option b n'existe pas
    3. Le troisième / : erreur, idem
    4. Le quatrième /, censé marquer la fin du motif

    Donc soit vous choisissez un délimiteur qui n'apparaît pas, comme vos /, dans le motif (revenir à vos # initiaux, par exemple) ou bien vous échappez vos 2e et 4e /.

    Pour les options, j'ai fait des suppositions car je n'ai pas accès à votre source (domaine parqué). Mais vous aurez besoin de l'option s, si la partie du motif .* inclue des nouvelles lignes, sinon il n'y aura jamais correspondance. Pour l'option U, je n'ai rien dit, vous avez en réalité déjà spécifié le caractère non gourmand au niveau de votre parenthèse capturante.

    Et si vous souhaitez capturer plus d'une occurrence, il faudra s'orienter vers preg_match_all.

  5. #5
    Membre éclairé Avatar de xess91
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 408
    Par défaut
    Non non c'est pas la bonne adresse je l'ai modifié, sinon je suis arrivé à mes fins en changeant preg_match par ereg et en enlevant les "/" de début et de fin.

    Merci pour les conseils!

    Parcontre je ne sais pas ce que c'est "la gourmandise".

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Erf, ereg est dépréciée puisqu'elle sera amenée à disparaître (usage générant d'ailleurs, à partir de PHP 5.3.0, un message d'erreur E_DEPRECATED). Pour que ça marche avec les fonctions POSIX et non PCRE, il doit certainement vous manquer le modificateur s.

    La gourmandise : c'est le fait que le moteur d'expression régulière va chercher la chaîne la plus longue possible et non la plus courte (c'est le cas en PHP, aussi bien avec PCRE qu'avec les fonctions POSIX). Prenons un exemple pour illustrer :
    Soit le motif <b>.*</b> visant à chercher ce qui est en gras dans un document HTML.
    Avec une chaîne de recherche :
    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    avant <b>gras1</b> entre <b>gras2</b> après

    Un motif gourmand (<b>.*</b>) ne vous trouvera qu'une seule correspondance :
    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    <b>gras1</b> entre <b>gras2</b>
    Car il prendra du premier <b> au dernier </b>.

    Un motif non gourmand (<b>.*?</b> ou autre possibilité avec PCRE : #<b>.*</b>#U), trouvera bien toutes les correspondances. Deux ici :
    Et :

    Faites le test

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [RegEx] Analyse de code HTML d'une liste déroulante
    Par sigmoun dans le forum Langage
    Réponses: 7
    Dernier message: 19/08/2009, 13h57
  2. [RegEx] Analyser du code html
    Par Invité dans le forum Langage
    Réponses: 1
    Dernier message: 05/08/2009, 20h38
  3. [MySQL] Analyse de code HTML
    Par safari25 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 12/06/2009, 17h06
  4. Analyse de code HTML et simplification par l'XML
    Par Punky65250 dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 10/11/2005, 10h24
  5. Analyse de code HTML en réponse a une requête post.
    Par ghost942 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 04/06/2005, 21h40

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