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 :

Vérification motifs dans chaine : preg_match_all


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 63
    Points : 33
    Points
    33
    Par défaut Vérification motifs dans chaine : preg_match_all
    Bonjour,

    alors voilà j'aimerais repérer certains motifs, ou du moins la présence de certains motifs dans une chaîne. J'ai donc logiquement pensé à :

    Mais j'ai un petit problème d'algo ou alors de compétences vis à vis de cette commande.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $string = "06 00 52 44 10 96 85";
    $tabKey = array('06', '52', '44', '46', '40', '10', '85');
    En fait je voudrais vérifier si 3 au moins des éléments du tableau $tabKey se trouve bien (dans leur ordre d'apparition dans le tableau) dans la chaîne $string.

    En gros la chaine "06 44 85" devrait passer.

    Pour l'instant j'ai codé qqch du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function constructPattern($tabKey) {
        $pattern = '/';
        foreach ($tabKey as $keyWords) {
            $pattern .= '([^\.?!)]*)' . preg_quote($keyWords, '/') . '([^\.)]*)';
        }
        $pattern .= '/i';
        return $pattern;
    }
    Mais cela oblige la présence de TOUS les éléments du tableau $tabKey.

    J'ai donc fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $sizeOfTable = count($tabKey);
    if ($sizeOfTable >= $sizeOfSequence) {
        for ($i = 0; $i <= $sizeOfTable - 3; $i++) {
            $newTabKey = array();
            for ($j = 0; $j < 3; $j++) {
                array_push($newTabKey, $tabKey[$i + $j]);
            }
            array_push($newTabKeyTotal, $newTabKey);
        }
    }
    Mais là encore, ça construit le tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ['06', '52', '44'] ; ['52', '44' '46'] ;  ['44' '46','40'] ; ['46','40','10'] ; ['40','10','85']
    Mais du coup ça ne vérifie pas les pattern ['06', '52', '40'] ou bien encore ['06', '46', '85'].

    En espérant m'être fait comprendre ^^ En gros je voudrais que seulement 3 des nombres de ce tableau soit nécessaire pour que la chaîne passe le pattern, les autres étant facultatif.


    Merci d'avance !

  2. #2
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Mieux que les expressions régulières, utilise les fonctions de manipulations des tableaux qui sont très puissantes en php :

    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
    $string = "06 00 52 44 10 96 85";
    $tabKey = array('06', '52', '44', '46', '40', '10', '85');
     
    $tabSearch = explode(" ", $string);
     
    $tabRes = array();
    foreach ($tabSearch as $key => $value) {
        $keySearch = array_search($value, $tabKey);
        if ($keySearch !== false) {
            $tabRes[] = $tabKey[$keySearch];
            $tabKey = array_slice($tabKey, $keySearch + 1);
        }
    }
     
    print_r($tabRes);
     
    if (count($tabRes) >= 3) {
        echo "Pattern respecté !";
    }
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    Un énorme merci !
    J'étais parti sur du array_intersect et de la comparaison de clef pour vérifier l'ordre, un vrai casse tête, puis lourd en plus...
    J'espère par contre que niveau performance c'est au moins aussi "puissant" comme tu dis que preg_match_all ^^

    Encore un immense merci !

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

Discussions similaires

  1. [RegEx] [Optimisation] Vérification motifs dans chaîne
    Par 0.GeGe.0 dans le forum Langage
    Réponses: 15
    Dernier message: 03/06/2014, 17h32
  2. Réponses: 19
    Dernier message: 08/07/2010, 22h30
  3. Réponses: 16
    Dernier message: 17/06/2009, 12h21
  4. Réponses: 2
    Dernier message: 13/05/2009, 10h11
  5. Positions motif dans chaine
    Par manna dans le forum Général Python
    Réponses: 1
    Dernier message: 05/04/2008, 11h46

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