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 :

Appliquer un urldecode sur toute les url d'une page [RegEx]


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 55
    Points : 30
    Points
    30
    Par défaut Appliquer un urldecode sur toute les url d'une page
    Bonjour,

    J'aimerai en fait appliquer un urldecode sur toutes les urls d'une page mais je n'y arrive pas, j'ai commencé par faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <?php
    $chaine = '|href="(.*?)"|i';
    $contenu = preg_replace($chaine,urldecode($1),$contenu);
    ?>
    Vous vous en serez douté, ça ne fonctionne pas, il n'y a qu'à voir la coloration syntaxique du $1 pour s'en rendre compte.

    Si vous étiez à ma place comment procéderiez vous ?

    Merci.

  2. #2
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Bonjour,

    Tu pourrais utiliser preg_replace_callback. Tu trouveras des exemples qui devraient t'y aider dans la doc php (lein donné)

  3. #3
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 55
    Points : 30
    Points
    30
    Par défaut
    Merci de votre réponse.
    A vrai dire, j'ai visité la doc et je n'y ai rien compris. Même les exemples sont trop tordus.
    Si ça te dérange de me donner la solution à mon problème pourrais tu stp me montrer un exemple de l'utilisation de cette fonction qui soit un peu moins difficile ?

    Merci encore une fois.

    EDIT

    Voila un petit code qui explique ce que je veux faire, vous pouvez le tester chez vous et vous verrez que quand vous visualisez le code source de la page générée l'url n'a pas été décodée .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    $url = 'ceci est un test <a href="http://www.actu-master.com/index.php%3Fpage%3Doutils" >test.html</a> encore un test';
     
    	$chaine = '|href="(.*?)"|i';
    	$contenu = preg_replace($chaine,'href="'.urldecode('$1').'"',$url);
     
     
    echo $contenu;
    ?>

  4. #4
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    J'ai bien compris ce que tu voulais faire.

    Mais ta solution n'est pas la bonne. Dans ton cas tu remplaces par 'href="'.urldecode('$1').'"' soit 'href="$1"' (puisque la chaîne '$1 n'est pas modifiée par urldecode).

    La solution est donc de passer par une fonction de callback, comme proposé.

    Un exemple après adaptation de la doc php (non testé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $url = preg_replace_callback('@(?<=href=").*(?=")@i',
        create_function('$matches', 'return urldecode($matches[0]);'),
        $url);

  5. #5
    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 : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Bonjour,

    Personnellement, je suis un adepte de la simplicité :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <?php
     
    $buffer = 'ceci est un test <a href="http://www.actu-master.com/index.php%3Fpage%3Doutils" >test.html</a> encore un test';
    $pattern = '|href="([^"]*)"|i';
    if ( preg_match($pattern, $buffer, $matches) ) {
        $url = $matches[1];
        $buffer = str_replace($url, urldecode($url), $buffer);
    }
     
    echo $buffer;

    En complément, je milite pour une utilisation minimale du .* dans les regex
    C'est un gouffre à performances et une fuite de contrôle dans les regex.
    Pour notre exemple,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pattern = '/"(.*?)"/';
    Sera avantageusement remplacé par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pattern = '/"([^"]*)"/';
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  6. #6
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    L'inconvénient de cette solution est qu'elle ne fonctionne que pour le premier lien. Il faut utiliser preg_match_all et modifier un peu le script pour remplacer "toutes les urls d'une page".

    Et je ne trouve pas cette solution beaucoup plus simple que l'utilisation de preg_replace_callback... Mais ça c'est un avis personnel

    Pour ce qui est de la regex, je suis d'accord pour le côté "fuite de contrôle" lorsqu'on utilise .* dans un regex. Pour ajouter ma pierre du côté gouffre de performance, l'utilisation des assertions me semble les améliorer, en évitant une capture.

  7. #7
    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 : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par Eusebe Voir le message
    L'inconvénient de cette solution est qu'elle ne fonctionne que pour le premier lien. Il faut utiliser preg_match_all et modifier un peu le script pour remplacer "toutes les urls d'une page".

    Et je ne trouve pas cette solution beaucoup plus simple que l'utilisation de preg_replace_callback... Mais ça c'est un avis personnel

    Pour ce qui est de la regex, je suis d'accord pour le côté "fuite de contrôle" lorsqu'on utilise .* dans un regex. Pour ajouter ma pierre du côté gouffre de performance, l'utilisation des assertions me semble les améliorer, en évitant une capture.
    Je viens de me rappeler une alternative à la fonction de callback : l'option d'évaluation. Est-ce plus simple ? Je pense que c'est une affaire de goût...

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $buffer = 'ceci est un test <a href="http://www.actu-master.com/index.php%3Fpage%3D1" >test.html</a> encore un <a href="http://www.actu-master.com/index.php%3Fpage%3D2" >test</a>';
    $pattern = '|href="([^"]*)"|ie';
    $buffer = preg_replace($pattern, "'href=\"'.urldecode('\\1').'\"'", $buffer) ; 
    echo $buffer;

    Ou qui pourra être élégamment mixée avec les assertions pour avoir une fonction d'évaluation moins compliquée (pour qui maîtrise les assertions ):

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $buffer = 'ceci est un test <a href="http://www.actu-master.com/index.php%3Fpage%3D1" >test.html</a> encore un <a href="http://www.actu-master.com/index.php%3Fpage%3D2" >test</a>';
    $pattern = '|(?<=href=")[^"]*(?=")|ie';
    $buffer = preg_replace($pattern, "urldecode('\\0')", $buffer) ; 
    echo $buffer;
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  8. #8
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par jml94 Voir le message
    Je viens de me rappeler une alternative à la fonction de callback : l'option d'évaluation.
    Oui, ça je ne connaissais pas !
    Mais je le note

  9. #9
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 55
    Points : 30
    Points
    30
    Par défaut
    Merci à vous deux. Grace à vous j'ai résolu mon problème et j'ai appris deux trois choses .

    Merci encore.

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

Discussions similaires

  1. Avoir un message de confirmation sur tout les liens d'une page
    Par Oberown dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 27/12/2012, 11h02
  2. Récupérer toutes les urls d'une page
    Par M3enjamin dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 24/11/2009, 17h00
  3. Réponses: 4
    Dernier message: 29/01/2009, 14h44
  4. Modifier toutes les URL d'une page apres chargement.
    Par landsteph dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 25/08/2007, 21h11
  5. Réponses: 3
    Dernier message: 25/07/2005, 18h41

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