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

  1. #1
    Membre actif 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
    Points : 241
    Points
    241
    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 : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    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 averti
    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
    Points : 309
    Points
    309
    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 émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 838
    Points
    2 838
    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 actif 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
    Points : 241
    Points
    241
    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 actif 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
    Points : 241
    Points
    241
    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 ?

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

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Et le mien, il sent pas bon ?!

  8. #8
    Membre actif 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
    Points : 241
    Points
    241
    Par défaut
    Le tiens ne m'affiche rien du tout

    Je tiens à préciser que mon tableau provient d'un champ text area d'un formulaire sur lequel j'ai fait un explode pour n'avoir que ce qui m'intéresse.

  9. #9
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 838
    Points
    2 838
    Par défaut
    en fait, vu que tu as toujours un point d'exclamation, on peut s'en servir comme délimiteur...

    bien que mon code marchait... mais pas chez toi, c'est étrange...

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
    $arr = array("1 Casque d'orc simple d'adresse! 32 28.05.2009", "12 Anneau de force accrue +3! 715 22.03.2009", "12 Anneau de force accrue +30! 715 22.03.2009");
     
    foreach ($arr AS $k => $v) {
    	$curr = explode("!", $v);
    	$arr[$k] = $curr[0];
    }
    $pattern = "#^([0-9 ]*)#"; // si tu souhaites supprimer aussi l'espace entre le nombre et le texte, si tu t'en fiches => ""#^(\d)*#""
    foreach ($arr AS $str) {
    	$str = preg_replace($pattern, "", $str);
    	echo "<p>".$str." !</p>";
    }
    ?>

    affichera :
    Casque d'orc simple d'adresse !

    Anneau de force accrue +3 !

    Anneau de force accrue +30 !

    EDIT :
    hmm d'apres l'array de s.n.a.f.u, il n'y a pas toujours de point d'exclamation... c'est surment pourquoi mon code déconnait vu que je me basais tjs dessus :/

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

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par JulienFio Voir le message
    Le tiens ne m'affiche rien du tout

    Je tiens à préciser que mon tableau provient d'un champ text area d'un formulaire sur lequel j'ai fait un explode pour n'avoir que ce qui m'intéresse.
    Et pourtant, j'ai testé sur toutes tes valeurs et ça marche...

    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{1,2}\.\d{1,2}\.\d{4}#';
     
    $arr = array ( "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");
     
    foreach($arr as $objet) {
        if ( preg_match($reg, $objet, $match) )
            print $match[1]."\n";
    }
    --- edit ---
    Avec une petite modif pour ne pas prendre le point d'exclamation.

  11. #11
    Membre actif 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
    Points : 241
    Points
    241
    Par défaut
    bon y'a du mieux,

    le résultat du code de darkstar123456 m'affiche ceci :
    Casque d'orc simple d'adresse

    Masque de Groucho Marx 18 28.05.2009

    Amulette très bonne du brandisseur de massue 155 29.03.2009

    Tablier de forgeron 11 27.05.2009

    Gilet de pingouin en cuir de force 69 31.05.2009

    Cape très bonne du brandisseur de massue

    Bracelets en or de l'armurier

    Gants en cuir d'adresse +2 15 19.04.2009

    Anneau de résistance physique +2

    Anneau d'adresse +2

    Anneau de célérité +2

    Anneau de force accrue +3

    Fléau en quartz de combat de force 73 4.06.2009

    Petit bouclier en glace éternelle

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

    Bottes en cuir pressé
    Le explode "!" est une excellente idée il me fait sauter tous les chiffres sur les items dont le nom se terminent par "!". malheureusement ce n'est pas le cas de tout les items (certains n'ont pas "!" à la fin. Ce "!" signifie juste que l'objet appartient au groupe). Je ne souhaite pas forcément le faire apparaitre dans ma liste, je m'en fou.
    Ce qu'il faudrait je pense, c'est, après le explode faire un filtre avec une expression régulière pour ne prendre que :

    Lettres (éventuellement "+" "un chiffre") mais pas le reste pour avoir comme résultat :
    Casque d'orc simple d'adresse

    Masque de Groucho Marx

    Amulette très bonne du brandisseur de massue

    Tablier de forgeron

    Gilet de pingouin en cuir de force

    Cape très bonne du brandisseur de massue

    Bracelets en or de l'armurier

    Gants en cuir d'adresse +2

    Anneau de résistance physique +2

    Anneau d'adresse +2

    Anneau de célérité +2

    Anneau de force accrue +3

    Fléau en quartz de combat de force

    Petit bouclier en glace éternelle

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

    Bottes en cuir pressé

    Je t'assure que ton code ne m'affiche rien Snafu
    Oui je confirme qu'il marche comme tu me l'as écrit, mais quand je veux l'utiliser dans mon code ça ne marche pas..

    Toi tu l'as fais avec un array de base :
    array=("blablabla", "blablabla", etc..)

    moi mon tableau proviens d'un champ texte que j'ai explosé avec un délimiteur et c'est peut-être la nuance qui fait foirer le code..

    voici mon code en entier :
    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
    24
    25
    26
    27
    28
     
    $page_entrepot = $_POST['matos'];
    $matos = explode("Objets pris", $page_entrepot);
    $matos = $matos[1];
    $matos = explode("Exporter sous", $matos);
    $matos = $matos[0];
    $matos = explode("sac", $matos);
    $matos = $matos[0];
    $matos = explode("\r\n", $matos);
    //print_r($matos);
     
     
    for ($i=3;$i<sizeof($matos);$i++) 
    {	
    	$array[$count]=$matos[$i];
    	$count++;
    }//car les 3 premières occurrences de $matos sont vide et le foreach de la suite n'aimerait pas. 
     
    foreach ($array AS $k => $v) {
    	$curr = explode("!", $v);
    	$array[$k] = $curr[0];
    }
    $pattern = "#^([0-9 ]*)#"; 
     
    foreach ($array AS $str) {
    	$str = preg_replace($pattern, "", $str);
    	echo "<p>".$str." </p>";
    }

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

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par JulienFio Voir le message
    Je sais pas pourquoi mais le tiens ne m'affiche rien Snafu
    C'est con, je suis assez sûr du motif, et je trouve que vous prenez un chemin bien compliqué pour arriver à vos fins.

    Peux-tu essayer ça, en prenant ton tableau comme source de données

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $reg = '#\d+ ([^!]+)!? \d+ \d{1,2}\.\d{1,2}\.\d{4}#';
     
    foreach($arr as $objet) {
        if ( preg_match($reg, $objet, $match) )
            printf("<p>%s</p>\n", $match[1]);
        else
            echo '<p>echec du matching</p>';
    }

  13. #13
    Membre actif 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
    Points : 241
    Points
    241
    Par défaut
    echec du matching pour toutes les occurrences..

    Oui je confirme qu'il marche comme tu me l'as écrit, mais quand je veux l'utiliser dans mon code ça ne marche pas..

    Toi tu l'as fais avec un array de base :
    array=("blablabla", "blablabla", etc..)

    moi mon tableau proviens d'un champ texte que j'ai explosé avec un délimiteur et c'est peut-être la nuance qui fait foirer le code..

    voici mon code en entier :
    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
    24
    25
    26
    27
    28
    29
     
    $page_entrepot = $_POST['matos'];
    $matos = explode("Objets pris", $page_entrepot);
    $matos = $matos[1];
    $matos = explode("Exporter sous", $matos);
    $matos = $matos[0];
    $matos = explode("sac", $matos);
    $matos = $matos[0];
    $matos = explode("\r\n", $matos);
    //print_r($matos);
    $count=0;
     
     
    for ($i=3;$i<sizeof($matos);$i++) 
    {	
    	$array[$count]=$matos[$i];
    	$count++;
    }//car les 3 premières occurrences de $matos sont vide et le foreach de la suite n'aimerait pas. 
     
    foreach ($array AS $k => $v) {
    	$curr = explode("!", $v);
    	$array[$k] = $curr[0];
    }
    $pattern = "#^([0-9 ]*)#"; 
     
    foreach ($array AS $str) {
    	$str = preg_replace($pattern, "", $str);
    	echo "<p>".$str." </p>";
    }
    bon là j'ai utilisé le code de dark car il me rapproche du résultat final que je souhaite obtenir, avec le tiens j'ai un echec du matching

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

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Pourrais-tu donner le contenu de $page_entrepot ?

    Je pense qu'il est possible d'obtenir ton résultat à partir de cette chaîne en utilisant preg_match_all, ce qui évitera cette série d'explosions brutales.

  15. #15
    Membre actif 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
    Points : 241
    Points
    241
    Par défaut
    Le crieur de nouvelles: "cotacter angedead"X Le crieur de nouvelles: "recherche personne pour monter groupe classe indiférente"X Le crieur de nouvelles: "cherche groupe qui prene des lvl 3 svp merci de repondre"X Le crieur de nouvelles: "moi je suis lvl 3prenait moi"X Le crieur de nouvelles: "Recherche barde / sorcier spé. soutient / alchimiste ou tank ! Contacter Aryanna"X Le crieur de nouvelles: "Les enforceurs recherchent barbare niveau 1 à 3 : mp Zeragar"X 08:38:18 Moloch L'éminent Gladiateur Dinturan Niv. 27 1 179 528 Actualités Actualités Actualités Héros Héros Héros Mes héros Attributs Talents Equipement Entrepôt Cave Entrepôt du groupe Salle du trésor Configuration Mon profil Tous les héros Titre Groupe Groupe Groupe Mon groupe Donjons Quêtes Rapports de combats Tableau d'honneur Forum de recherche Forum de mon groupe Chat Tous les groupes Ma guilde Forum de la guilde Toutes les Guildes Taverne Taverne Taverne Messages Forum Chercher Chat Sondages Crieur Colisée Colisée Colisée Combat-spectacle Recherche d'adversaires Quêtes de guildes Forum des duels Chat de duel Résultats Classements Héros Groupes Guildes Bazar Bazar Bazar Place du marché Mes ventes Forum d'achat et de vente Chat de commerce Echanges Ventes aux enchères Affaires Mendiants et bienfaiteurs Registre de commerce Compte Compte Compte Compte premium Multi-comptes Paramètres Newsletter WoD Parainage Parainage Parainage Avantages Inviter par mail Sur des forums Sur mon site internet Logos WoD Mes recrues Classement Voter pour WoD Bibliothèque Bibliothèque Bibliothèque Forum général Encyclopédie FAQ Classes et peuples Coût des augmentations Rang de Maître Smilies Finances Liste des donjons Liste éternelle des meilleurs Quitter Quitter Quitter Voter pour WoD! Moloch: Entrepôt déplacer vers : Exporter sous : bbcode xml csv Lignes par page: Prix fixe 1 Amanite tue-mouches (fraîche) (3/6) 7 Aujourd'hui 2 Amulette du protecteur magique en verre de volcan de bravade (9/12) 11 Aujourd'hui 3 Bague magique en verre de volcan de la raison (7/15) 14 Aujourd'hui 4 Chapeau saint de serpent en cuir d'adresse 743 13.06.2009 5 Fil à broder rouge 23 14.06.2009 6 Flèches (carquois) améliorés (52/100) 23 Aujourd'hui 7 Focus magique en verre de volcan de bravade (5/10) 10 Aujourd'hui 8 Franges de cuir vert émeraude 45 7.06.2009 9 Gemme verte foncée 45 12.06.2009 10 Gilet en cuir de rapidité +2 41 16.04.2009 11 Ingrédient alchimique : racine de mandragore (séchée) 30 Aujourd'hui 12 Marteau de guerre d'Horius! 720 20.03.2009 13 Masque de Groucho Marx 23 9.06.2009 14 Mode d'emploi des glyphes de pouvoir violettes 158 19.05.2009 15 Mode d'emploi des lignes de pouvoir vertes foncées 23 19.04.2009 16 Morceaux de soufre (5/9) 17 Aujourd'hui 17 Paire de bottes cuirassées du pingouin 99 Aujourd'hui 18 Parchemin du vol de mana (3/6) 7 Aujourd'hui 19 Petit bouclier en glace éternelle! 750 14.06.2009 20 Pigments de couleur vert foncé 45 12.06.2009 21 Potion d'habileté exceptionnelle (3/3) 86 19.05.2009 22 Potion guérissante (7/8) 107 Aujourd'hui 23 Résine bleue 23 14.06.2009 Lignes par page: déplacer vers : Chercher Nom de l'objet : Talent : Pour la classe de héros/peuple : / Type de port : Classe d'objet : Anoblissements : Unique : Objet de groupe : Objets pris Prix fixe 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 sac Prix fixe 1 Couverture d'hiver 1 23.01.2009 2 Dague-clé à manche de golem! 19.05.2009 3 Dague-clé à manche de taureau! 15.05.2009 4 Dague-clé à manche translucide! 15.05.2009 5 Filet à jeter de gobelin 24 30.12.2008 6 Filet à jeter simple 9 3.12.2008 7 Grain de sable de l'éternité! 53 14.06.2009 8 Message de Mérilla! 27.12.2008 9 Peau de louveteau tannée 15 30.05.2009 10 Perle de la contemplation! 38 15.05.2009 11 Petite fée de bronze 0 27.04.2009 12 Petite fée dorée! 0 29.04.2009 13 Petite fée rouge! 0 29.04.2009 14 Pièces tintenantes (petite bourse) 18 5.02.2009 15 Potion médicinale (petite bouteille) (3/3) 6 3.12.2008 Exporter sous : bbcode xml csv décoration Prix fixe 1 Grande couronne de feuilles de chêne 300 13.03.2009 2 Grande couronne de laurier 450 27.04.2009 3 Grande feuille de trèfle 210 21.01.2009 4 Médaille de guerre de la bataille de Kargash Peak 300 19.03.2009 Indications [Cacher] * Un héros peut porter jusqu'à 4 anneaux. * Cliquez ici, pour réactiver la question de sécurité lors des ventes à prix fixe., . * Ton héros a 884 objets. Contact Mentions légales CGU Protection des Données Copyright © 2009 by Neise Games GmbH v2.01.005 -
    il faut savoir que c'est variable au début, à cause du crieur de nouvelles. KIl peut y avoir plus ou moins de messages en attente. C'est pourquoi je fais un premier explode à partir de "Objets pris" car c'est là que commence l'inventaire du perso.

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

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    J'y arrive aussi comme ça :

    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
     
    <?php
    // a decommenter pour tester en live
    //$str = $_POST['matos'];
     
    // chaîne de test
    $str = <<< EOT
    Le crieur de nouvelles: "cotacter angedead"X Le crieur de nouvelles: "recherche personne pour monter groupe classe indiférente"X Le crieur de nouvelles: "cherche groupe qui prene des lvl 3 svp merci de repondre"X Le crieur de nouvelles: "moi je suis lvl 3prenait moi"X Le crieur de nouvelles: "Recherche barde / sorcier spé. soutient / alchimiste ou tank ! Contacter Aryanna"X Le crieur de nouvelles: "Les enforceurs recherchent barbare niveau 1 à 3 : mp Zeragar"X 08:38:18 Moloch L'éminent Gladiateur Dinturan Niv. 27 1 179 528 Actualités Actualités Actualités Héros Héros Héros Mes héros Attributs Talents Equipement Entrepôt Cave Entrepôt du groupe Salle du trésor Configuration Mon profil Tous les héros Titre Groupe Groupe Groupe Mon groupe Donjons Quêtes Rapports de combats Tableau d'honneur Forum de recherche Forum de mon groupe Chat Tous les groupes Ma guilde Forum de la guilde Toutes les Guildes Taverne Taverne Taverne Messages Forum Chercher Chat Sondages Crieur Colisée Colisée Colisée Combat-spectacle Recherche d'adversaires Quêtes de guildes Forum des duels Chat de duel Résultats Classements Héros Groupes Guildes Bazar Bazar Bazar Place du marché Mes ventes Forum d'achat et de vente Chat de commerce Echanges Ventes aux enchères Affaires Mendiants et bienfaiteurs Registre de commerce Compte Compte Compte Compte premium Multi-comptes Paramètres Newsletter WoD Parainage Parainage Parainage Avantages Inviter par mail Sur des forums Sur mon site internet Logos WoD Mes recrues Classement Voter pour WoD Bibliothèque Bibliothèque Bibliothèque Forum général Encyclopédie FAQ Classes et peuples Coût des augmentations Rang de Maître Smilies Finances Liste des donjons Liste éternelle des meilleurs Quitter Quitter Quitter Voter pour WoD! Moloch: Entrepôt déplacer vers : Exporter sous : bbcode xml csv Lignes par page: Prix fixe 1 Amanite tue-mouches (fraîche) (3/6) 7 Aujourd'hui 2 Amulette du protecteur magique en verre de volcan de bravade (9/12) 11 Aujourd'hui 3 Bague magique en verre de volcan de la raison (7/15) 14 Aujourd'hui 4 Chapeau saint de serpent en cuir d'adresse 743 13.06.2009 5 Fil à broder rouge 23 14.06.2009 6 Flèches (carquois) améliorés (52/100) 23 Aujourd'hui 7 Focus magique en verre de volcan de bravade (5/10) 10 Aujourd'hui 8 Franges de cuir vert émeraude 45 7.06.2009 9 Gemme verte foncée 45 12.06.2009 10 Gilet en cuir de rapidité +2 41 16.04.2009 11 Ingrédient alchimique : racine de mandragore (séchée) 30 Aujourd'hui 12 Marteau de guerre d'Horius! 720 20.03.2009 13 Masque de Groucho Marx 23 9.06.2009 14 Mode d'emploi des glyphes de pouvoir violettes 158 19.05.2009 15 Mode d'emploi des lignes de pouvoir vertes foncées 23 19.04.2009 16 Morceaux de soufre (5/9) 17 Aujourd'hui 17 Paire de bottes cuirassées du pingouin 99 Aujourd'hui 18 Parchemin du vol de mana (3/6) 7 Aujourd'hui 19 Petit bouclier en glace éternelle! 750 14.06.2009 20 Pigments de couleur vert foncé 45 12.06.2009 21 Potion d'habileté exceptionnelle (3/3) 86 19.05.2009 22 Potion guérissante (7/8) 107 Aujourd'hui 23 Résine bleue 23 14.06.2009 Lignes par page: déplacer vers : Chercher Nom de l'objet : Talent : Pour la classe de héros/peuple : / Type de port : Classe d'objet : Anoblissements : Unique : Objet de groupe : Objets pris Prix fixe 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 sac Prix fixe 1 Couverture d'hiver 1 23.01.2009 2 Dague-clé à manche de golem! 19.05.2009 3 Dague-clé à manche de taureau! 15.05.2009 4 Dague-clé à manche translucide! 15.05.2009 5 Filet à jeter de gobelin 24 30.12.2008 6 Filet à jeter simple 9 3.12.2008 7 Grain de sable de l'éternité! 53 14.06.2009 8 Message de Mérilla! 27.12.2008 9 Peau de louveteau tannée 15 30.05.2009 10 Perle de la contemplation! 38 15.05.2009 11 Petite fée de bronze 0 27.04.2009 12 Petite fée dorée! 0 29.04.2009 13 Petite fée rouge! 0 29.04.2009 14 Pièces tintenantes (petite bourse) 18 5.02.2009 15 Potion médicinale (petite bouteille) (3/3) 6 3.12.2008 Exporter sous : bbcode xml csv décoration Prix fixe 1 Grande couronne de feuilles de chêne 300 13.03.2009 2 Grande couronne de laurier 450 27.04.2009 3 Grande feuille de trèfle 210 21.01.2009 4 Médaille de guerre de la bataille de Kargash Peak 300 19.03.2009 Indications [Cacher] * Un héros peut porter jusqu'à 4 anneaux. * Cliquez ici, pour réactiver la question de sécurité lors des ventes à prix fixe., . * Ton héros a 884 objets. Contact Mentions légales CGU Protection des Données Copyright © 2009 by Neise Games GmbH v2.01.005 -
    EOT;
     
    // extraction des objets pris
    $reg = '/Objets pris (.+?) sac Prix fixe/i';
    // affichage
    if (preg_match($reg, $str, $match)) {
        $str = $match[1];
        $reg = '#\d+ ([^!]+?)!? \d+ \d{1,2}\.\d{1,2}\.\d{4}#';
        if ( preg_match_all($reg, $str, $matches) ) {
            printf("<h3>%d objets trouvés</h3>", count($matches[1]));
            foreach($matches[1] as $objet) printf("<p>%s</p>\n", $objet);
        }
    }
    --- edit ---
    Modifié pour extraire jusqu'à "sac Prix fixe" pour ne pas couper un éventuel objet sac magique

  17. #17
    Membre averti
    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
    Points : 309
    Points
    309
    Par défaut
    Plop

    Il faudrait que tu relèves d'une part toute les représentations d'objet possible. Car j'ai déjà 2 patterns différents :

    N°Objet | espace | Nom objet | point exclamation | espace |valeur | espace | date

    N°Objet | espace | Nom objet |espace |valeur | espace | date

    Vu que tu as une date pour chaque objets, tu peux faire un premier découpage sur les points de la date en retirant la valeur du jour.

    pour avoir sur chaque ligne d'un tableau un objet et en fonction du pattern en faire le découpage

    ++

  18. #18
    Membre actif 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
    Points : 241
    Points
    241
    Par défaut
    Snafou :

    Avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $reg = '/Objets pris (.+?) sac Prix fixe/i';
    je ne rentre pas dans le if
    et quand je mets simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $reg = 'Objets pris';
    je bloque sur la condition du if :
    Warning: Delimiter must not be alphanumeric or backslash in c:\program files\easyphp1-8\www\wod\cible.php on line 156

    narutobaka :

    Voici la liste d'items que j'ai actuellement et qui résume tout les cas possible.
    Casque d'orc simple d'adresse

    Masque de Groucho Marx 18 28.05.2009

    Amulette très bonne du brandisseur de massue 155 29.03.2009

    Tablier de forgeron 11 27.05.2009

    Gilet de pingouin en cuir de force 69 31.05.2009

    Cape très bonne du brandisseur de massue

    Bracelets en or de l'armurier

    Gants en cuir d'adresse +2 15 19.04.2009

    Anneau de résistance physique +2

    Anneau d'adresse +2

    Anneau de célérité +2

    Anneau de force accrue +3

    Fléau en quartz de combat de force 73 4.06.2009

    Petit bouclier en glace éternelle

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

    Bottes en cuir pressé
    J'ai essayer de refaire un filtre par derrière pour virer les chiffres de la fin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $str = preg_replace('[0-9]{2,3}\s[0-9]{1,2}\.[0-9]{2}\.[0-9]{4}', " ", $str);
    mais j'ai ce message d'erreur :
    Warning: Unknown modifier '{' in c:\program files\easyphp1-8\www\wod\cible.php on line 131

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

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par JulienFio Voir le message
    et quand je mets simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $reg = 'Objets pris';
    je bloque sur la condition du if
    Normal, il faudrait au moins mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $reg = '/Objets pris/i';
    Mais je ne comprend pas pourquoi ça marche avec une chaîne de test et pas avec la variable $_POST. La seule explication est que ces chaînes soient différentes.
    C'est très difficile de faire une extraction sur une chaîne dont on ne maîtrise pas du tout le contenu...

    Essaies de remplacer par ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $reg = '/Objets pris (.+?) sac/i';
    mais je commence à désespérer des données en entrée...

  20. #20
    Membre actif 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
    Points : 241
    Points
    241
    Par défaut
    Ca ne m'affiche rien

    par contre en mettant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $reg = '/Objets pris/i';
    // affichage
    if (preg_match($reg, $str, $match)) {
        print_r($match); 
        $str = $match[1]; // ligne 160
        $reg = '#\d+ ([^!]+?)!? \d+ \d{1,2}\.\d{1,2}\.\d{4}#';
        if ( preg_match_all($reg, $str, $matches) ) {
            printf("<h3>%d objets trouvés</h3>", count($matches[1]));
            foreach($matches[1] as $objet) printf("<p>%s</p>\n", $objet);
        }
    }
    j'ai
    Array ( [0] => Objets pris )
    Notice: Undefined offset: 1 in c:\program files\easyphp1-8\www\wod\cible.php on line 160
    Merci pour ta persévérance

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

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