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 :

Extraire des infos d'une chaine de caractères (problème avec les espaces)


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 25
    Points : 11
    Points
    11
    Par défaut Extraire des infos d'une chaine de caractères (problème avec les espaces)
    Bonjour,

    J'ai un soucis pour récupérer des informations d'une chaine de caractère...

    En gros, la chaine est de ce type :

    nom:Eric et Jean Smith adresse:rue de Paris ville:Marseille passions:livre musique

    je souhaite récupérer les infos suivants les items (ici : Eric et Jean Smith / rue de Paris / Marseille / livre musique)

    J'ai donc créé (avec difficulté, j'essaye de me mettre au expressions régulière) ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     preg_match_all('/(?P<item>\w+):(?P<nom>\w+)/', $fiche_extraction, $matches_fiche);
    pour récupérer les infpos dans le tableau $matches_fiche

    Et, évidemment, il y a un soucis : je ne récupère que le premier mot, l'espace semblant mettre fin à la récupération...

    Sans doute ma paterne est-elle fausse... le \w+ ne prenant quele premier mot... A noter qu'il n'y a pas nécessairement d'autres mots derrière mais qu'il meut y en avoir plusieurs...

    Merci de votre aide!

    cordialement

  2. #2
    Invité
    Invité(e)
    Par défaut
    Oui, l'espace n'est pas dans la classe \w. Le défi semble plutôt de différencier l'espace comme délimiteur (précédent l'item) et ceux dans une phrase. Je dirais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all('/(?P<item>\w+):(?P<nom>.(?:.(?!\w+:))+)/', $fiche_extraction, $matches_fiche);
    ou son contraire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all('/(?P<item>\w+):(?P<nom>.+?(?=\s\w+:|$))/', $fiche_extraction, $matches_fiche);

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    un grand merci pour ton aide, j'ai bien avancé grâce à toi...

    mais, second effect kiss cool, j'ai encore un "petit" soucis :

    la chaine de départ contient diffférent parametres et le premier élément retourné n'est pas nécessairement celui que je désire...

    en gros, je peux avoir une chaine comme celle la :
    nom:Eric et Jean Smith adresse:rue de Paris ville:Marseille passions:livre musique

    ou comme celle ci:
    Age:18 nom:Eric et Jean Smith adresse:rue de Paris ville:Marseille passions:livre musique

    ce qui fait que si je récupère $matches[1][0], je n'ai pas nécessairement le nom...

    est-il possible de s'en sortir ou dois-je revoir entièrement ma copie?

    Les expressions régulière, plus je creuse et plus... il y a à creuser... c'est fou comme c'est puissant! Mais terriblement exigeant

  4. #4
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Question : est-ce que la source ne serait pas un fichier XML par hasard ?
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  5. #5
    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
    Ce que tu peux faire c'est te servir des deux points et des espaces en jouant avec les classes de caractères:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $pattern = '~(?<key>[^:]+):(?<value>[^:]+)(?: |\z)~';
    if (preg_match_all($pattern, $fiche_extraction, $matches_fiche, PREG_SET_ORDER)) {
        foreach($matches_fiche as $m) {
            $result[$m['key']] = $m['value'];
        }
    }
    Il faut juste exploiter le fait que chaque valeur est soit suivie d'un espace puis d'une autre clef, soit suivie par la fin de la chaîne.

    Une autre méthode peut consister à spliter la chaîne sur l'espace avant une nouvelle clef:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $items = preg_split('~ (?=\w+:)~', $fiche_extraction);
    foreach ($items as $item) {
        list($key, $value)= explode(':', $item);
        $result[$key] = $value;
    }
    Quelque soit la méthode, l'ordre des éléments n'a aucune importance puisqu'au final tu peux les identifier grâce à leur clef.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par le korrigan Voir le message
    ou comme celle ci:
    Age:18 nom:Eric et Jean Smith adresse:rue de Paris ville:Marseille passions:livre musique
    S'il faut éviter un match sur Age en tant qu'item il est possible de faire une exclusion par référence arrière dans le style (?<!age) et s'il y a aussi un autre "champs" à ignorer de l'ajouter à la liste (?<!age|champs)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all('/(?P<item>\w+(?<!age)):(?P<nom>.(?:.(?!\w+:))+)/i', $fiche_extraction, $matches_fiche);
    Citation Envoyé par le korrigan Voir le message
    ce qui fait que si je récupère $matches[1][0], je n'ai pas nécessairement le nom...
    S'il faut avoir $matches[0]['nom'] = 'valeur'; alors array_combine() est ce qu'il faut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $fiche_extraction = 'Age:18 nom:Eric et Jean Smith adresse:rue de Paris ville:Marseille passions:livre musique';
    preg_match_all('/(\w+):(.(?:.(?!\w+:))+)/', $fiche_extraction, $matches_fiche);
    $matches[] = array_combine($matches_fiche[1], $matches_fiche[2]);
    var_dump($matches);

Discussions similaires

  1. [Tableaux] Extraire des mots d'une chaine de caractères
    Par pratiquement dans le forum Langage
    Réponses: 5
    Dernier message: 24/01/2008, 09h20
  2. extraire des entiers d'une chaine de caractère
    Par 18Marie dans le forum Langage
    Réponses: 9
    Dernier message: 10/08/2006, 11h17
  3. Réponses: 4
    Dernier message: 11/05/2006, 14h41
  4. [MySQL] extraire des nombre d'une chaine de caractères et addition
    Par Yotho dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 04/03/2006, 16h54
  5. Réponses: 9
    Dernier message: 17/01/2003, 11h45

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