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 :

REGEX sur balise html: Besoin d'aide !


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 28
    Points : 12
    Points
    12
    Par défaut REGEX sur balise html: Besoin d'aide !
    Bonjour à toutes et à tous

    voila, j'ai une fonction qui récupère le code source d'un URL.
    Il fonctionne très bien. La voici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    function codeSource($adresseFunction){
     
    	if (substr($adresseFunction, 0, 7) == "http://") {
    		$ajoutProtocol = "";
    	} else {
    		$ajoutProtocol = "http://";
    	}
     
    	if ($ouverture = @fopen($ajoutProtocol.$adresseFunction, "rb")) {
    		if ($lecture = stream_get_contents($ouverture)) {
    			$lecture= htmlentities($lecture);
    			$lecture='<pre>'.$lecture.'</pre>';
    			return $lecture;
    		} else { 
    			echo 'La page '.$adresseFunction.' ne peut ?e lut!';
    		}
    	} else { 
    		echo 'Probl? d\'ouverture de la page '.$adresseFunction.'!';
    	}
    	@fclose($ouverture);
    }
    Seulement j'ai un problème de regex.
    J'aimerais pouvoir faire un REGEX avec comme paramètre, par exemple, "<title>", mais cela ne fonctionne pas. Pourtant, un ECHO d'un résultat m'affiche bien sous forme de texte le bon code source, avec les balise HTML correctement affiché.

    J'ai bien des doutes quand au codage du texte, mais je m'en sort pas trop...



    Une idée ?

    Merci d'avance

  2. #2
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Pour parser du HTML, utilise DOMDocument ou SimpleXML et les XPath plutôt que des regexp.

    Et ta fonction getSource peut se résumer à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
     
    function codeSource ($url) {
        (stripos($url, 'http://') === false) && ($url = 'http://' . $url);
        $stream = file_get_contents($url);
        return $stream ? '<pre>' . htmlentities($stream) . '</pre>' : false;
    }

  3. #3
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    avec un pattern du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    '#<title[^>]>(.*)</title>#i';
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 28
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par gene69 Voir le message
    avec un pattern du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    '#<title[^>]>(.*)</title>#i';
    non malheureusement, cela ne fonctionne pas, il m'indique "0"...


    @Benjamin Delespierre
    pourrais tu, stp, me donner un exemple de requête DOMDocument et XPath pour avoir l'équivalent de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '#<title[^>]>(.*)</title>#i';
    stp ? merci d'avance

  5. #5
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    '#<title[^>]*>(.*)</title>#i';

    j'ai du oublié une étoile...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    <?php
     
    $doc = new DOMDocument;
     
    // We don't want to bother with white spaces
    $doc->preserveWhiteSpace = false;
     
    $doc->Load('book.xml');
     
    $xpath = new DOMXPath($doc);
     
    // We starts from the root element
    $query = '//book/chapter/para/informaltable/tgroup/tbody/row/entry[. = "en"]';
     
    $entries = $xpath->query($query);
     
    foreach ($entries as $entry) {
        echo "Found {$entry->previousSibling->previousSibling->nodeValue}," .
             " by {$entry->previousSibling->nodeValue}\n";
    }
    ?>
    ah non ça c'est le manuel 1 pour 1.



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <?php
     
    $doc = new DOMDocument;
     
    // We don't want to bother with white spaces
    $doc->preserveWhiteSpace = false;
     
    $doc->Load('page.html');
     
    $xpath = new DOMXPath($doc);
     
    // We starts from the root element
    $query = '//html/header/title';
     
    $entries = $xpath->query($query);
     
    foreach ($entries as $entry) {
        echo "Found ",$entry /* probablement un bug conversion en chaine impossible*/," node val:",$entry->nodeValue;
    }
    ?>
    disclaimer: non testé... mais les exemples de la doc php fonctionnent généralement.
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  6. #6
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Ouaip
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    libxml_use_internal_errors(true);
     
    $doc = new DOMDocument;
    $doc->loadHTMLFile('http://google.fr');
     
    $title = $doc->getElementsByTagName('title')->item(0);
    echo $title->nodeValue;

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 28
    Points : 12
    Points
    12
    Par défaut
    Merci beaucoup. Je vais tenter de faire mon bonheur avec tout ca. Je reviens vers vous au cas ou je cale sur la durée...

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 28
    Points : 12
    Points
    12
    Par défaut
    arf non j'y arrive pas. ^^

    je vais exposer plus explicitement mon soucis.

    je voudrais récupérer toute les villes contenu sur cette pages:
    http://www.pagesdor.be/q/business/static/gov.html

    (les villes apparaissent à partir du titre "A l'échelon communal")

    franchement, la je cale méchament...

  9. #9
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    libxml_use_internal_errors(true);
     
    $doc = new DOMDocument;
    $doc->loadHTMLFile('http://www.pagesdor.be/q/business/static/gov.html');
     
    $xpath = new DOMXPath($doc);
     
    $villes = array();
    foreach($xpath->query('//*[@id="inner-static"]/table//child::a') as $node) {
    	$villes[] = $node->nodeValue;
    }
     
    var_dump($villes);
    Trop facile

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 28
    Points : 12
    Points
    12
    Par défaut
    Hou la... c'est énorme comment ça fonctionne bien. je vais essayer de comprendre ligne par ligne la mécanique du query $xpath...

    la déclaration d'objet et la structure globale, ca va.
    mais par contre, la création du pattern pour récupérer tel chose a tel endroit, ca a l'air chaud...

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 28
    Points : 12
    Points
    12
    Par défaut
    Je suis en train de me faire un tutorial de feu ^^

  12. #12
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Pas tellement voici l'explication de la requête XPath employée ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //*[@id="inner-static"]/table//child::a
    
    // signifie à partir de n'importe où
    *[@id="inner-static"] signifie n'importe quel noeud ayant l'id "inner-static"
    /table signifie noeud table directement fils du précédent (inner-static)
    //child::a signifie n'importe quel noeud a descendant du précedent (attention, c'est le descendant qui nous intéresse, pas le fils direct)
    Pour comprendre et maitriser les XPath par l'exemple: http://jerome.developpez.com/xmlxsl/xpath/

Discussions similaires

  1. [HTML] Besoin d'aide HTML pour faire suivre une requête
    Par desolation dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 19/07/2007, 10h26
  2. Réponses: 3
    Dernier message: 19/04/2007, 07h50
  3. News sur mon site besoin d'aide !
    Par MMO95 dans le forum Langage
    Réponses: 2
    Dernier message: 25/02/2007, 22h05
  4. [HTML] Besoin d'aide en HTML
    Par fabris dans le forum Balisage (X)HTML et validation W3C
    Réponses: 17
    Dernier message: 08/08/2006, 16h34
  5. [CSS][HTML]Besoin d'aide
    Par Brian dans le forum Mise en page CSS
    Réponses: 14
    Dernier message: 03/09/2005, 23h22

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