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 :

Pb Regex extraction URL


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 18
    Points : 17
    Points
    17
    Par défaut Pb Regex extraction URL
    Bonjour,
    Je souhaiterai extraire les urls des balises :
    provenant d'une sortie html d'un script php.
    Les urls que je souhaite identifier sont écrites sans quotes :
    Ex : href=toto.php?x=1&y=2

    J'ai fouillé le forum sans succès donc j'ai avancé un peu par moi-même pour obtenir le résultat suivant :
    {href=(.*?)( |>)}s
    Le second sous-masque ( |>) sert à identifier le caractère qui vient après le dernier caractère de l'url, donc ' ' ou '>'.
    Ce regex marche presque sauf qu'il me retourne deux sous-chaînes :
    - l'url
    - les caractères ' ' ou '>' suivant les cas
    Or je souhaiterai qu'il me retourne que l'url !
    Merci de votre aide.

    PS : Pour tester :
    http://www.quanetic.com/regex.php

    -Fly06

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    montre nous un petit exemple de code PHP que tu utilises

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 18
    Points : 17
    Points
    17
    Par défaut
    Merci pour ta réponse, mathieu.

    En fait mon objectif est de faire de la réécriture d'url en utilisant la fonction preg_replace_callback.

    En cherchant, je me suis aperçu que la syntaxe suivante :
    {href=(.*?)(?: |>)}s
    donnait le résultat attendu (parenthèses non capturantes).

    Mais à l'usage, la fonction preg_replace_callback remplaçait l'url d'origine par l'url transformée non pas à la place de l'url définie par matches[1] mais à la place du pattern global (' ' ou '>' inclus) !!!

    En lisant la doc sur preg_replace_callback, je crois comprendre que les composantes du tableaux $matches (d'indices 1, 2, ...) correspondent aux sous-masques du regex... (Vous confirmez ?)

    Donc si je garde mon regex d'origine, il suffit de modifier la fonction de remplacement appelée dans preg_replace_callback pour qu'elle ajoute $matches[2] à la fin de l'url transformée... et le tour est joué !

    Je viens d'avoir l'idée, je n'ai pas encore testé... (merci de me donner votre avis).

    -Fly06

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 18
    Points : 17
    Points
    17
    Par défaut
    Bon j'ai testé et ça a l'air de marcher

    Vous vouliez du code ? En voilà :

    J'utilise un CMS qui gère le SEF mais j'ai un module tiers qui lui ne le gère pas.
    Ce module tiers retourne du code html dans une variable $content qui peut contenir une ou plusieurs urls. Ces urls ne sont pas conforme W3C puisque les quotes manquent mais bon les browsers comprennent...
    J'ai donc ajouté le code qui sert à transformer les urls pour le contenu html du CMS à la fin du module (juste avant le return) :

    $regex = "#href=\"(.*?)\"#s";
    $content = preg_replace_callback( $regex, 'sef_replacer', $content );
    La fonction sef_replacer fait le boulo de transformation url standards ==> urls modifiées SEF.

    Le pb était que ce regex suppose que les urls sont entourées de double quotes ! Il fallait donc le changer.

    J'ai donc opté pour le regex du premier post :
    $regex = "#href=(.*?)( |>)#s";
    Mais comme la fonction preg_replace_callback retourne un tableau $matches dont les composantes (d'indices 1, 2, ...) correspondent aux sous-masques du regex et que le remplacement se fait sur la totalité du regex et non sur le premier sous-masque il fallait aussi changer la fonction sef_replacer en sef_replacer_2 :
    $content = preg_replace_callback( $regex, 'sef_replacer_2', $content );
    avec :

    function Sef_replacer_2( &$matches ) {
    return Sef_replacer( &$matches ) . $matches[2];
    }
    Voilà vous savez tout.

    Je pense que c'est ok en dehors du simple fait que ça a l'air de marcher mais bon j'ai découvert les expressions régulières ce matin donc j'aimerai bien avoir le feedback d'une personne qui a un peu plus de recul sur la question...

    -Fly06

Discussions similaires

  1. Probleme de regex - extraction url avec tiret
    Par joboy84 dans le forum Langage
    Réponses: 1
    Dernier message: 01/07/2008, 20h37
  2. [RegEx] regex pour url
    Par temperature dans le forum Langage
    Réponses: 5
    Dernier message: 23/05/2008, 14h43
  3. [regex]extraction de lignes
    Par afrikha dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 15/09/2006, 12h46
  4. erreur extraction url à partir de mysql
    Par rozow dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 21/03/2006, 10h45

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