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 :

Rechercher un terme récurant dans un fichier texte et l'insérer dans un tableau. [PHP 7]


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 229
    Points : 91
    Points
    91
    Par défaut Rechercher un terme récurant dans un fichier texte et l'insérer dans un tableau.
    Bonsoir à tous,

    Je pêche dans ma recherche alors je viens demander de l'aide aux initiés PHP...

    Je suis en train de me faire un fichier EPG pour ma HAT TNT et SAT pour pouvoir l'utiliser sur mon système de domotique. Bref, j'ai généré un fichier m3u que je souhaiterais convertir pour l'insérer dans MySQL.

    J'ai des "tags" récurrents dans mon fichier :
    #EXTINF:-1 tvg-id="http://www.arte.tv/" tvg-name="|ALLEMAGNE| ARTE ASTRA 19.2" tvg-logo="http://192.168.1.150/logotheque/arte_de.png" group-title="CULTURE ALLEMAGNE ASTRA 19.2",|ALLEMAGNE| ARTE ASTRA 19.2
    http://192.168.1.150/1258

    Je souhaiterais pouvoir récupérer les informations qui se trouve, par exemple, entre tvg-id=" et les " suivantes et l'insérer dans un tableau associatif, faire ceci pour chaque occurrences et ensuite mettre la ligne du dessous dans le tableau en question.

    J'espère être assez clair dans ma demande.

    Merci d'avance pour votre aide.

  2. #2
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 229
    Points : 91
    Points
    91
    Par défaut
    J'avance dans mes recherches, il semble que je dois utiliser "preg_match_all" mais j'ai du mal à comprendre la syntaxe à utiliser.

  3. #3
    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
    Disons que ton m3u ressemble à ça (avec notamment les attributs qui sont optionnels ainsi que l'espace après la virgule):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $m3u = '#EXTM3U
     
    #EXTINF:0 tvg-name="BBC" audio-track="eng" tvg-logo="http://mylogos.domain/BBC.png", BBC World
    http://server.name/stream/to/video2
    #EXTINF:0 tvg-name="CNN" audio-track="rus", CNN International
    http://server.name/stream/to/video2
    #EXTINF:0, Arirang
    http://server.name/stream/to/video3
    #EXTINF:-1 tvg-id="http://www.arte.tv/" tvg-name="|ALLEMAGNE| ARTE ASTRA 19.2" tvg-logo="http://192.168.1.150/logotheque/arte_de.png" group-title="CULTURE ALLEMAGNE ASTRA 19.2",|ALLEMAGNE| ARTE ASTRA 19.2
    http://192.168.1.150/1258';
    Je ne sais pas si c'est exactement la structure de tableau que tu recherches mais voici comment je vois la chose:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    $pattern = '~(*BSR_ANYCRLF)
    ^ \Q#EXTINF:\E
    (?<length> 0 | -1 | [1-9][0-9]* )    [ ]*
    (?<attributes> (?: [ ]* [\w-]+ =" [^"]* " \B )+ )?    , [ ]*
    (?<title> .* \S )    [ ]* \R
    (?<url> .* \S )
    ~xum';
     
    preg_match_all($pattern, $m3u, $matches, PREG_SET_ORDER | PREG_UNMATCHED_AS_NULL);
     
    $results = [];
    $keys = array_flip(['length', 'attributes', 'title', 'url']);
     
    foreach($matches as $m) {
        if ( $m['attributes'] !== null ) {
            preg_match_all('~(?<name> [\w-]+ ) = " (?<value> [^"]* ) " ~xu', $m['attributes'], $attr);
            $m['attributes'] = array_combine($attr['name'], $attr['value']); 
        }
     
        $results[] = array_intersect_key($m, $keys);
    }
     
    print_r($results);
    Démo.

    La première pattern effectue un premier découpage en extrayant la longueur de la piste (ici 0 ou -1 vu que c'est du streaming), les éventuels attributs en un seul bloc, le titre de la piste et son url.

    La deuxième pattern qui est dans la boucle se charge elle d'extraire les attributs un à un.

    À noter que si tu utilises une version de php inférieure à 7.2, le flag PREG_UNMATCHED_AS_NULL ne sera pas disponible (il faudra alors le retirer et tester si $m['attributes'] est vide plutôt que null).

    Les deux patterns utilisent des captures nommées pour plus de clarté (?<url> ... ) afin d'extraire les différentes parties de la chaîne, ainsi que le modificateur x (ce qui fait que les espaces sont ignorées dans les patterns, sauf ceux placés dans une classe de caractères).

    Avec le modificateur x le caractère # prend un sens spécial (il permet de placer un commentaire en ligne dans la pattern, comme // en php). C'est pour cette raison que j'ai placé #EXTINF: entre \Q et \E (QuotE) pour que le # soit vu de façon littéral (j'aurai tout aussi bien pu juste échapper le # avec un antislash pour le même résultat).

    Au tout début de la première pattern, la directive (*BSR_ANYCRLF) se rapporte au \R (BackSlash R) que l'on trouve plus loin. \R est un alias pour figurer un saut de ligne qui peut être de plusieurs formats: \r (CR) pour les anciens OS mac, \r\n (CRLF) pour Windows, \n (LF) pour Linux, ainsi que d'autres plus exotiques. Cette directive donc fait se cantonner \R aux trois plus courants précédemment cités en ignorant la tabulation vertical, le caractère NEL, le séparateur de paragraphe... Je l'ai ajouté juste pour être précis, la pattern fonctionnera sans.

    Le modificateur m fait que l'ancre ^ correspondra à un début de ligne.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  4. #4
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 229
    Points : 91
    Points
    91
    Par défaut
    C'est exactement ce que je cherchais. Cette nuit, j'ai réussi à sortir quelque chose mais j'ai énormément de mal à trouver des cours détaillés et simplifiés sur les expressions régulières et surtout ce qu'on peut mettre comme pattern. C'est la que ça coince.

    Un grand merci car avec ce bout de code, j'arrive à avancer.

  5. #5
    Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 077
    Points : 17 178
    Points
    17 178
    Par défaut
    Salut
    Citation Envoyé par Trebor Voir le message
    ... mais j'ai énormément de mal à trouver des cours détaillés et simplifiés sur les expressions régulières....
    Peut être que ce lien te sera utile: https://regex101.com/ et ce cours sur DVP Les regex ou expressions régulières en JavaScript
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  6. #6
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 229
    Points : 91
    Points
    91
    Par défaut
    Un grand merci, c'est beaucoup plus clair désormais, même s'il me reste encore des choses à comprendre mais ces deux sites sont très intéressant et m'ont permis d'avancer.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/01/2008, 18h04
  2. VBA-E Recherche des différents noms dans mon tableau excel
    Par tazmania dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 16/04/2007, 19h31
  3. Réponses: 5
    Dernier message: 15/03/2007, 06h58
  4. recherche de valeur identique dans un tableau
    Par jean tof dans le forum Langage
    Réponses: 9
    Dernier message: 20/06/2006, 13h33
  5. [Tableaux] Recherche d'une chaine dans un tableau
    Par tom06440 dans le forum Langage
    Réponses: 5
    Dernier message: 20/10/2005, 23h27

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