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 :

Filtrer une chaine de caractère [RegEx]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté Avatar de JulienFio
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 201
    Par défaut Filtrer une chaine de caractère
    Bonjour,

    alors, dans une boucle je parcours un tableau et je souhaite y faire un traitement. Le code ci dessous me donne le résultat de la citation qui suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for ($i=3;$i<sizeof($matos);$i++)
    {
    	$split = split('[0-9])', $matos[$i]);	
    	print_r($split);	
    	$count++;			
    }


    Array ( [0] => 1 Casque d'orc simple d'adresse! 32 28.05.2009 ) Array ( [0] => 2 Masque de Groucho Marx 18 28.05.2009 ) Array ( [0] => 3 Amulette très bonne du brandisseur de massue 155 29.03.2009 ) Array ( [0] => 4 Tablier de forgeron 11 27.05.2009 ) Array ( [0] => 5 Gilet de pingouin en cuir de force 69 31.05.2009 ) Array ( [0] => 6 Cape très bonne du brandisseur de massue! 196 6.04.2009 ) Array ( [0] => 7 Bracelets en or de l'armurier! 139 5.02.2009 ) Array ( [0] => 8 Gants en cuir d'adresse +2 15 19.04.2009 ) Array ( [0] => 9 Anneau de résistance physique +2! 305 24.04.2009 ) Array ( [0] => 10 Anneau d'adresse +2! 310 12.04.2009 ) Array ( [0] => 11 Anneau de célérité +2! 310 9.04.2009 ) Array ( [0] => 12 Anneau de force accrue +3! 715 22.03.2009 ) Array ( [0] => 13 Fléau en quartz de combat de force 73 4.06.2009 ) Array ( [0] => 14 Petit bouclier en glace éternelle! 690 29.05.2009 ) Array ( [0] => 15 Chausses léger en nicolite simple de mailles possédant le don d'adresse! 687 23.05.2009 ) Array ( [0] => 16 Bottes en cuir pressé! 77 5.05.2009 )
    ce qu'il me faut, c'est récupérer le nom de l'objet uniquement. Mon problème c'est qu'il ne s'agit pas seulement de lettres (ça je sais faire) mais il peut y avoir aussi des chiffres.

    ex :
    Casque d'orc simple d'adresse!
    Anneau de force accrue +3!

    voici l'expression rationnelle que j'ai cherché et qui d'après moi ce rapproche le plus de la bonne (mais elle ne marche pas.. je n'ai aucun résultat avec..)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    $pattern='(^[a-z]+ \+[0-5]{0,})';  // l'expression rationnelle en question !
    $count=0;
     
    for ($i=3;$i<sizeof($matos);$i++)
    {
     
    	$split = split('[0-9])', $matos[$i]);	
    	//print_r($split);
    	$item[$count] = preg_match($pattern, $split[0]);
    	print_r($item);
    	$count++;			
    }
    Merci pour votre aide

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

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Salut,

    Dans un premier temps, j'aurais bien utilisé preg_grep, mais cette fonction ne sait pas (encore) capturer.

    Et une autre remarque : pour parcourir un tableau, utiliser foreach est beaucoup plus simple et plus parlant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
    $reg = '#\d+ (.*) \d+ \d{2}\.\d{2}\.\d{4}#';
     
    $arr = array( "1 Casque d'orc simple d'adresse! 32 28.05.2009",
                  "10 Anneau d'adresse +2! 310 12.04.2009");
     
    foreach($arr as $objet) {
        if ( preg_match($reg, $objet, $match) )
            print $match[1]."\n";
    }

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Par défaut
    bonjour,

    Pourquoi ne pas utiliser un séparateur lorsque tu enregistres un nouvel item.

    du style :

    Casque d'orc simple d'adresse! ; 32 ; 28.05.2009

    ainsi quand tu voudras refaire la liste des items tu split sur ce séparateur

    c juste une idée.

    ++

  4. #4
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut
    je suis pas très doué en regex, mais essaye ça :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    $arr = array("Casque d'orc simple d'adresse! 32 28.05.2009", "Anneau de force accrue +3! 715 22.03.2009", "Anneau de force accrue +30! 715 22.03.2009");
     
    $pattern = "#(?:! [0-9]*[ 0-9]{3}.[0-9]{2}.[0-9]{4})#";
    foreach ($arr AS $str) {
    	$str = preg_replace($pattern, "", $str);
    	echo "<p>".$str." !</p>";
    }
    ?>

    sinon, il est clair que le plus simple est d'avoir un délimiteur

  5. #5
    Membre expérimenté Avatar de JulienFio
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 201
    Par défaut
    Je n'aurais pas eu de problème avec un délimiteur cela ne fait aucun doute mais je ne peux pas en mettre. C'est un jeu déjà existant et je n'ai pas accès au code source ^^, mon programme est indépendant et sera mit à disposition de la communauté.

    Je fais un copier coller de la page des attributs/talents/inventaire et le programme va formater tout ça pour que ces caractéristiques de personnage puissent être misent facilement et surtout rapidement sur les forum des groupes de joueurs.

    Merci pour vos réponse, je vais les essayer

  6. #6
    Membre expérimenté Avatar de JulienFio
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 201
    Par défaut
    Bon j'ai testé vos réponses et ça semble marcher...mais pas dans mon cas précis...

    moi j'ai ça comme tableau de données :
    Array ( [0] => 1 Casque d'orc simple d'adresse! 32 28.05.2009 [1] => 2 Masque de Groucho Marx 18 28.05.2009 [2] => 3 Amulette très bonne du brandisseur de massue 155 29.03.2009 [3] => 4 Tablier de forgeron 11 27.05.2009 [4] => 5 Gilet de pingouin en cuir de force 69 31.05.2009 [5] => 6 Cape très bonne du brandisseur de massue! 196 6.04.2009 [6] => 7 Bracelets en or de l'armurier! 139 5.02.2009 [7] => 8 Gants en cuir d'adresse +2 15 19.04.2009 [8] => 9 Anneau de résistance physique +2! 305 24.04.2009 [9] => 10 Anneau d'adresse +2! 310 12.04.2009 [10] => 11 Anneau de célérité +2! 310 9.04.2009 [11] => 12 Anneau de force accrue +3! 715 22.03.2009 [12] => 13 Fléau en quartz de combat de force 73 4.06.2009 [13] => 14 Petit bouclier en glace éternelle! 690 29.05.2009 [14] => 15 Chausses léger en nicolite simple de mailles possédant le don d'adresse! 687 23.05.2009 [15] => 16 Bottes en cuir pressé! 77 5.05.2009 [16] => )
    et quand je mets ce code là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $pattern = "#(?:! [0-9]*[ 0-9]{3}.[0-9]{2}.[0-9]{4})#";
    foreach ($array AS $str) {
    	$str = preg_replace($pattern, "", $str);
    	echo "<p>".$str." !</p>";
    }
    ça m'affiche ça..
    1 Casque d'orc simple d'adresse! 32 28.05.2009 !

    2 Masque de Groucho Marx 18 28.05.2009 !

    3 Amulette très bonne du brandisseur de massue 155 29.03.2009 !

    4 Tablier de forgeron 11 27.05.2009 !

    5 Gilet de pingouin en cuir de force 69 31.05.2009 !

    6 Cape très bonne du brandisseur de massue! 196 6.04.2009 !

    7 Bracelets en or de l'armurier! 139 5.02.2009 !

    8 Gants en cuir d'adresse +2 15 19.04.2009 !

    9 Anneau de résistance physique +2! 305 24.04.2009 !

    10 Anneau d'adresse +2! 310 12.04.2009 !

    11 Anneau de célérité +2! 310 9.04.2009 !

    12 Anneau de force accrue +3! 715 22.03.2009 !

    13 Fléau en quartz de combat de force 73 4.06.2009 !

    14 Petit bouclier en glace éternelle! 690 29.05.2009 !

    15 Chausses léger en nicolite simple de mailles possédant le don d'adresse! 687 23.05.2009 !

    16 Bottes en cuir pressé! 77 5.05.2009 !
    pourtant quand je teste le code précis de darkstar123456 ça fonctionne bien (l'expression rationnelle est bonne)... Pourquoi elle ne fait rien dans mon cas ?

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

Discussions similaires

  1. Comment filtrer une chaine de caractère
    Par pierrot10 dans le forum jQuery
    Réponses: 6
    Dernier message: 24/02/2012, 14h23
  2. Filtrer une chaine de caractère sur le 6ème caractère
    Par lfa44 dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 12/02/2010, 18h51
  3. [AC-2000] Comment filtrer des mots dans une chaine de caractères
    Par bionet dans le forum Requêtes et SQL.
    Réponses: 11
    Dernier message: 21/07/2009, 18h16
  4. Filtrer une chaine de caractères
    Par ledisciple dans le forum Langage
    Réponses: 12
    Dernier message: 21/08/2008, 17h02
  5. Réponses: 2
    Dernier message: 06/12/2002, 07h50

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