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 :

[RegExp] Traitement d'un texte - Trouver les urls


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    347
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 347
    Par défaut [RegExp] Traitement d'un texte - Trouver les urls
    Bonjour,

    Je suis assez mauvais en Regexp du coup, j'en ai bricolé une qui marche que moyennement.
    J'ai un texte avec des urls. J'aimerais récupérer l'ensemble des URLs qui commence par Location: (et rien d'autre).
    Le problème avec mon script c'est que je récupère aussi l'url qui commence avec un préfixe tel que X-XRDS-Location et ça je ne veux pas. C'est très gênant, si vous pouviez m'aider à l'exclure ça serait top.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $data = "Location: https://ww.google.fr
    Location: https://www.yahoo.fr/news/
    Location: https://www.boncoin.fr/annonces/pages.php?_utm=[data]
    Location: https://www.netflix.fr
    Toto: https://www.msn.fr
    X-XRDS-Location: https://wwww.test.com";
    preg_match_all('#Location: [^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/))#', $data, $match);
    var_dump($match[0]);
    Résultat:
    array(5) {
      [0]=> string(30) "Location: https://ww.google.fr"
      [1]=> string(36) "Location: https://www.yahoo.fr/news/"
      [2]=> string(62) "Location: https://www.boncoin.fr/annonces/pages.php?_utm=[data"
      [3]=> string(32) "Location: https://www.netflix.fr"
      [4]=> string(31) "Location: https://wwww.test.com"
    }
    Après en moins bloquant, j'ai 2 questions bonus.
    - pour l'exemple https://www.boncoin.fr/annonces/pages.php?_utm=[data] je récupère que https://www.boncoin.fr/annonces/pages.php?_utm=[data. Le dernier caractère est tronqué, je ne sais pas trop pourquoi. Si vous avez une idée..
    - Dans $match le récupère l'ensemble des urls préfixés de Location:. En soit j'ai pas besoin de Location:, je le tronque manuelle ensuite par un substring mais je pense qu'en regexp, il est possible d'exclure le mot clef de détection. Enfin c'est que je pense

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 696
    Par défaut
    vous y étiez presque, il suffit de rajouter un "^" devant "Location" pour indiquer que cela doit être le début de la ligne :
    https://regex101.com/r/JjGb7E/1

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    347
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 347
    Par défaut
    Merci pour ton site. Je ne connaissais pas.
    Par contre, en rajoutant le ^. Ca ne fonctionne pas contraire à ce qu'indique le site.
    Ca m'affiche que la premiere url que la premiere ligne

  4. #4
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 696
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 696
    Par défaut
    ah oui il faut aussi ajouter "...#gm" à la fin. l'utilité des ces modificateurs est expliquée dans le lien de mon 1er message.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Principe :
    • une seule URL par ligne, plusieurs lignes (-> devra être multiligne)
    • "Location" en début de ligne (ou "location" ou "LOCATION" ou... -> devra être insensible à la casse)
    • suivi de ":" (avec éventuellement un espace avant et/ou après)
    • rien d'autre sur la ligne après chaque URL (sauf, éventuellement, des espaces)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    $data = "Location: https://ww.google.fr
    Location : https://www.yahoo.fr/news/
    location: https://www.boncoin.fr/annonces/pages.php?_utm=[data]
    LOCATION:https://www.netflix.fr       
    Toto: https://www.msn.fr
    X-XRDS-Location: https://wwww.test.com
    Location : http://www.yahoo.fr/
    ";
    Solution 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php
    $regex = '#^Location\s?:\s?(http.*)$#mi';
    preg_match_all($regex, $data, $match);
    // on ne récupère que les URL -> $match[1]
    $urls = array_map('trim', $match[1]); // supprime les espaces éventuels en fin de ligne
    var_dump( $urls );
    • m : multiligne
    • i : insensible à la casse
    • (g est inconnu en PHP)

    Solution 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php
    $regex = '#^Location\s?:\s?(http[^\s\t\r\n]*)#mi';
    preg_match_all($regex, $data, $match);
    // on ne récupère que les URL -> $match[1]
    $urls = $match[1];
    var_dump( $urls );
    • [^\s\t\r\n]* : tout sauf espace, tabulation, passage à la ligne
    • à noter : pas de $ ici
    • on ne récupère pas d'espaces (pas besoin de les supprimer en PHP)


    Donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    array (size=5)
      0 => string 'https://ww.google.fr' (length=20)
      1 => string 'https://www.yahoo.fr/news/' (length=26)
      2 => string 'https://www.boncoin.fr/annonces/pages.php?_utm=[data]' (length=53)
      3 => string 'https://www.netflix.fr' (length=22)
      4 => string 'http://www.yahoo.fr/' (length=20)
    Dernière modification par Invité ; 01/12/2019 à 10h42.

  6. #6
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    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 986
    Par défaut
    Je pars du principe que la chaîne est générée automatiquement, donc pas de variation de casse, ni d'espaces en moins ou en plus où que ce soit, et "Location: " est systématiquement suivit d'une URL (donc pas besoin de la décrire). Par contre, la séquence de nouvelle ligne est indéterminée (soit CRLF, soit LF, ou autre). Donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all('~(*ANY) ^ \QLocation: \E \K .+ ~xm', $data, $matches);
    ou bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all('~ ^ \QLocation: \E \K .* \S ~xm', $data, $matches);
    • (*ANY) : n'importe quelle séquence de nouvelle ligne est possible, donc le . ne pourra pas les matcher
    • \Q...\E délimite une chaîne ou les caractères spéciaux sont échappés et notamment les espaces.
    • \K définie l'endroit de la correspondance à partir duquel le résultat sera renvoyé.
    • \S un caractère qui n'est pas un espace (horizontal ou vertical).
    • modificateur m: ^ matche le début de ligne (et $ la fin de ligne).
    • modificateur x: les espaces et les commentaires sont ignorés dans la pattern.

Discussions similaires

  1. [RegEx] Trouver toutes les URL
    Par stailer dans le forum Langage
    Réponses: 2
    Dernier message: 21/02/2008, 18h23
  2. [débutant]Regexp + traitement de texte
    Par ambitious dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 30/11/2007, 15h51
  3. [RegEx] Trouver une URL dans un texte
    Par Lo-chan dans le forum Langage
    Réponses: 7
    Dernier message: 13/09/2007, 15h21
  4. TRegExpr : Trouver les URLs
    Par MaTHieU_ dans le forum Delphi
    Réponses: 5
    Dernier message: 02/05/2007, 19h31
  5. Réponses: 8
    Dernier message: 13/12/2006, 18h17

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