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 :

coup de mains pour un regexp pour récupérer une valeur dans un cookie [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Inscrit en
    Septembre 2004
    Messages
    387
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 387
    Points : 109
    Points
    109
    Par défaut coup de mains pour un regexp pour récupérer une valeur dans un cookie
    Bonjour à tous.

    J'aimerai récupérer un valeur dans un cookie.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # Netscape HTTP Cookie File
    # http://curl.haxx.se/docs/http-cookies.html
    # This file was generated by libcurl! Edit at your own risk.
     
    domain.com	FALSE	/	FALSE	1468448915	csrftoken	702a9b0cd471d257396106c469791caf
    #HttpOnly_domain.com	FALSE	/	FALSE	1444775315	sessionid	IGSCc8979bc01e51916f5b50bdd5c71d8eba1f69f4ae35edc41b6020cb2024a43095%3AAjBWskxfWmgU4nfty1c3pVRCsLsU10E6%3A%7B%22_token_ver%22%3A1%2C%22_auth_user_id%22%3A2069000724%2C%22_token%22%3A%222069000724%3As7TFLe8NXCZ3U0zgdWTQRPXrnvhE2Ztq%3A8cd4496ddecbd91aab7b6b2a9a7f34a8349d5aff5f9865a5809c170cd220c44c%22%2C%22_auth_user_backend%22%3A%22accounts.backends.CaseInsensitiveModelBackend%22%2C%22last_refreshed%22%3A1436999314.698397%2C%22_platform%22%3A1%7D
    domain.com	FALSE	/	FALSE	1444775315	ds_user	mon_user
    domain.com	FALSE	/	FALSE	2067719315	mid	VabekgABAAFIeJgBJz3fy8F5BQja
    domain.com	FALSE	/	FALSE	1444775315	ds_user_id	2069000724

    J'aimerai récupérer la valeur du csrftoken
    Sur la ligne on as :
    csrftoken 702a9b0cd471d257396106c469791caf
    comment puis je réucpérer cette valeur?
    J'ai tenté la regex suivante:

  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
    au lieu d'utiliser une expression régulière, c'est peut-être plus simple d'utiliser la fonction http://php.net/explode pour séparer aux espaces

  3. #3
    Membre régulier
    Inscrit en
    Septembre 2004
    Messages
    387
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 387
    Points : 109
    Points
    109
    Par défaut merci
    J'ai réussit dans passer pas une regexp, mais sans utiliser l'explode car cela me paraissait hasardeux si la stucture du cookie changeais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $cookie = file_get_contents('cookies.txt');
    $position_token = strpos($cookie, "csrftoken");
    $ligne = mb_strcut($cookie, $position_token, 999);
    $ligne_cut =  strpos($ligne, "\n");
    $ligne_cut2 =  strpos($ligne, "\t");
    $mon_token = mb_strcut($ligne, $ligne_cut2, ($ligne_cut-$ligne_cut2));
    Ca fonctionne mais je pense qu'avec un regexp ce serais plus rapide/propre/efficace!

  4. #4
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    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 858
    Points : 6 556
    Points
    6 556
    Par défaut
    L'approche regex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (false !== $cookie = file_get_contents('cook.txt') and preg_match('~(?:\t|^)csrftoken\t\K[[:xdigit:]]+(?=$|\t)~m', $cookie, $m))
        echo $m[0] . PHP_EOL;
    Elle a l'avantage de la concision, mais elle n'est pas plus rapide, essentiellement du fait qu'elle exige de charger l'intégralité du fichier avec file_get_contents.

    L'approche avec explode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if (false !== $fh = fopen('cook.txt', 'r')) {
        while (false !== $line = fgets($fh)) {
            $fields = explode("\t", trim($line));
            if (false !== $index = array_search('csrftoken', $fields) and isset($fields[++$index]) && ctype_xdigit($fields[$index])) {
                echo $fields[$index] . PHP_EOL;
                break;
            }
        }
        fclose($fh);
    }
    Dans ce cas là, on utilise fopen et fgets pour lire le fichier ligne par ligne, ce qui permet d'interrompre la lecture du fichier dés qu'on a trouvé la bonne ligne.


    Ces deux solutions ont l'avantage d'être assez robustes puisqu'elles permettent de s'assurer que "csrftoken" est bien un champ complet et pas une sous chaîne d'un autre champ, et aussi parce que la nature du champ suivant est vérifiée avec [[:xdigit:]]+ dans la pattern, ou avec ctype_xdigit dans l'autre code.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  5. #5
    Membre régulier
    Inscrit en
    Septembre 2004
    Messages
    387
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 387
    Points : 109
    Points
    109
    Par défaut
    Merci CosmoKnacki

    Et bah c'est dans ce cas que je me rends compte que je ne suis qu'un pietre bidouilleur de php.

    J'adore la syntaxe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (false !== $index = array_search('csrftoken', $fields) and isset($fields[++$index]) && ctype_xdigit($fields[$index])) {
    Betment j'aurais utilisé une boucle foreach.

    MERCI

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

Discussions similaires

  1. [XL-2007] Pb pour récupérer une valeur dans une Listbox: Obligé de cliquer au moins une fois
    Par Seb_VB dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 11/04/2011, 16h10
  2. Réponses: 5
    Dernier message: 27/04/2009, 16h15
  3. Réponses: 14
    Dernier message: 25/04/2009, 14h47
  4. Réponses: 5
    Dernier message: 09/09/2005, 17h51
  5. problème pour récupérer une valeur dans ma bd (débutante)
    Par auryn111 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 26/08/2005, 17h49

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