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 et preg_match


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2015
    Messages
    224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2015
    Messages : 224
    Points : 62
    Points
    62
    Par défaut Regex et preg_match
    Bonjour,

    J'ai un fichier HTML à ouvrir, et à faire quelques opérations dessus.
    Donc pour l'ouvrir je fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $fichier = file_get_contents("MonFichier.html");
    Ensuite, je dois stocker dans un tableau ($Tab) toutes les URL des liens hypertextes de la page, donc que l'on peut identifier par href="...".
    J'ai donc fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    preg_match_all('#(href=")(.*)(")#isU', $fichuer, $Tab );
    print_r($Tab[2]);
    Je pense que ça doit être bon, mais pour les afficher, comment faire pour qu'il y ait une URL par ligne ? J'ai essayé avec un foreach(...) mais ça ne marche pas, ou alors je l'avais mal fait.

    Ensuite à partir du tableau $Tab, il faut que j'affiche les différents sites web, donc ce qui est compris entre http:// et le 3ème /.
    Par exemple si on a ça : https://twitter.com/official_php, je voudrais que ça me sorte ceci : twitter.com
    C'est surtout là que je bloque. J'avais tenté ceci, mais sans réussite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    foreach($Tab as $SiteWeb)
    	{
    		preg_match('#(http://)(.*)(/)#',$SiteWeb[2],$Lien);
    		print_r($Lien);
    	}
    Pourriez-vous m'aider ?

    Merci d'avance.

  2. #2
    Membre confirmé
    Homme Profil pro
    Déveleoppeur Web/Mobile
    Inscrit en
    Avril 2013
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Déveleoppeur Web/Mobile
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 330
    Points : 545
    Points
    545
    Par défaut
    Pour afficher tous les matchs, il faut utiliser la méthode preg_match_all de php.

  3. #3
    Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2015
    Messages
    224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2015
    Messages : 224
    Points : 62
    Points
    62
    Par défaut
    C'est ce que j'ai fait dans le premier, non ?

  4. #4
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 912
    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 : 2 912
    Points : 6 705
    Points
    6 705
    Par défaut
    La fonction qui permet d'avoir plusieurs résultats est effectivement preg_match_all mais cela n'a pas d'importance vu que dans ce cas on n'utilise pas les regex mais DOMDocument:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $dom = new DOMDocument;
    // redirige les éventuelles erreurs html vers le gestionnaire interne d'erreurs de libxml ce qui évite l'affichage de warnings
    $state = libxml_use_internal_errors(true);
    // charge le fichier html et crée l'arbre DOM
    $dom->loadHTMLFile('monfichier.html');
    // l'instance de DOMXPath permet de faire des requêtes sur l'arbre DOM avec le langage xpath
    $xp = new DOMXPath($dom);
     
    foreach($xp->query('//@href') as $hrefAttr) {
        echo $hrefAttr->nodeValue, PHP_EOL;
    }
     
    libxml_use_internal_errors($state);
    Le langage xpath permet de faire très facilement des requêtes simple de manière concise. Ici // signifie n'importe quel descendant du nœud actuel (qui est ici le nœud racine du document, donc n'importe où dans le document), et le arobase précise qu'il s'agit d'un attribut. Le langage xpath permet également des requêtes très élaborées quasi impossible à réaliser avec une approche purement textuelle.

    Pour ce qui est ensuite d'extraire le nom de domaine de l'url, on utilise parse_url:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $url = 'http://www.twitter.com/blah/blah/?toto=titi';
    echo parse_url($url, PHP_URL_HOST), PHP_EOL;

  5. #5
    Membre confirmé
    Homme Profil pro
    Déveleoppeur Web/Mobile
    Inscrit en
    Avril 2013
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Déveleoppeur Web/Mobile
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 330
    Points : 545
    Points
    545
    Par défaut
    Essaie :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    foreach($Tab[0] as $SiteWeb)
    	{
    		print_r($SiteWeb."<br/>");
    	}

  6. #6
    Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2015
    Messages
    224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2015
    Messages : 224
    Points : 62
    Points
    62
    Par défaut
    CosmoKnacki : Merci pour les infos, mais l'exercice est spécifiquement sur les expressions régulières, donc je n'ai pas d'intérêt à utiliser autre chose...

    -Rpass- : Super merci, ça marche ! Je pense que je m'étais trompé dans ma boucle du coup.

    Par contre, je n'ai toujours pas trouvé de solution à ma 2ème question :
    J'ai fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    preg_match_all('#(http://)(.*)(/)#',$Tab[0],$Lien);
    Seulement je ne crois pas que ça m'apporte la bonne réponse, et puis $Tab[0] n'est pas accepté comme argument...

  7. #7
    Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2015
    Messages
    224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2015
    Messages : 224
    Points : 62
    Points
    62
    Par défaut
    Je viens de faire ça, mais j'ai un problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    foreach($Tab[0] as $Url)
    	{
    		preg_match('#(http://)(.*)(/)#',$Url[0],$Lien);
    		print_r($Lien."<br/>");
    	}
    mais visiblement le print_r pose probleme (Array to string conversion in...).

  8. #8
    Membre confirmé
    Homme Profil pro
    Déveleoppeur Web/Mobile
    Inscrit en
    Avril 2013
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Déveleoppeur Web/Mobile
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 330
    Points : 545
    Points
    545
    Par défaut
    Affiche le contenu de $Lien avec un var_dump pour vérifier son contenu et de voir ce qui est exploitable.

  9. #9
    Membre confirmé
    Homme Profil pro
    Déveleoppeur Web/Mobile
    Inscrit en
    Avril 2013
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Déveleoppeur Web/Mobile
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 330
    Points : 545
    Points
    545
    Par défaut
    $lien sera normalement un tableau contenant les différentes parties entre parenthèses. Je pense que tu devrais utiliser $Lien[1] et non $Lien[0], mais je n'ai pas la doc sous les yeux pour vérifier cela.

Discussions similaires

  1. [RegEx] regex preg_match php5
    Par Invité dans le forum Langage
    Réponses: 13
    Dernier message: 29/03/2016, 16h14
  2. Regex et preg_match
    Par splif dans le forum Langage
    Réponses: 6
    Dernier message: 23/08/2013, 11h31
  3. [RegEx] probleme regex preg_match
    Par omelhor dans le forum Langage
    Réponses: 2
    Dernier message: 14/12/2012, 16h50
  4. [RegEx] preg_match sur 4 types de regex
    Par daquad dans le forum Langage
    Réponses: 7
    Dernier message: 29/10/2010, 15h34
  5. Réponses: 4
    Dernier message: 05/03/2010, 17h58

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