8768 sujets

Développement web côté serveur, CMS

Bonjour tout le monde !

Un petit problème me turlupine (ce mot est décidément trop drôle). J'ai une REGEX supposée récupérer et traiter les chaînes de caractères sous la forme [[NomDeModule:NomObjet|TexteDeRemplacement]].

La partie |TexteDeRemplacement est facultative. Disons que tout marche correctement, sauf à partir de l'instant où un guillemet double se trouve dans le nom de mon objet. C'est très embêtant, car c'est un cas certainement amené à se produire par la suite.

Je n'ai pas vraiment envie de devoir lister tous les caractères autorisés pour pouvoir inclure les guillemets dans la REGEX. D'autant plus que je pensais que le signe "." remplaçait tous les caractères et que les guillemets ne sont pas des métacaractères (à ma connaissance et d'après mes nombreuses recherches pour élucider la question, en tous cas).

Si vous pouviez m'aider à trouver ce qui cloche, ce serait super de votre part à tous !

Merci d'avance, potos du net Smiley cligne

---

En ce qui concerne le code, le voici (désolé s'il est un peu long, mais vous ne pourrez pas comprendre si je le tronque)...
Le array $brackets est sous la forme classique de array($cle => $valeur)$valeur est toujours une chaîne de caractères sous la forme mentionnée au début du post
S'il y a d'autres trucs que vous ne comprenez pas ou des morceaux de code qui ne sont pas dans le bout qui suit, hésitez pas !


public function generateAlias(array $brackets)
    {
        /* --- Description de la fonction ---
         
            Forme des brackets reçue : [[Module:Objet(|texte)]]
         
            Etape 1: Enlever crochets -> Module:Objet(|texte)
            Etape 2: Récupérer Module, Objet, NomAlias (NomAlias = '' si non défini à la base)
            Etape 3: Récupérer idModule (idModule est forcément défini)
            Etape 4: Récupérer l'objet (idObjet est forcément défini)
             
            Etape 5: Vérifier si la ref existe:
                SI la ref existe (trouvée avec idModule, idObjet et nom correspondant TOUS)
                    On récupère la ref dans un objet Reference (ne peuvent être définis en même temps dans une
                    entrée de la table Reference: idModule et nom, car nom n'est spécifié que lorsque idObjet est
                    égal à 0)
                SINON on crée la référence et on la récupère dans un objet Reference
                 
            Etape 6: Vérifier si l'alias existe:
                SI l'alias existe (trouvé avec idReference et nom correspondant TOUS)
                    On récupère l'alias dans un objet Alias
                SINON on crée un alias et on le récupère dans un objet Alias
                         
            Etape 7: On génère l'alias sous forme textuelle: "@+id de l'alias"
            Etape 8: On renvoit un array des alias de toutes les brackets passées en argument à la fonction
                    initialement
         
        --- Fin de la description --- */
         
        $moduleManager = new ModuleManager($this->_bdd);
         
        $aliases = array();
     
        foreach ($brackets as $cle => $alias)
        {
            $bracket = $alias;
             
                // Etape 1: On enlève les crochets:
             
            $crochets = array('[[', ']]');
            $alias = str_replace($crochets, '', $alias);
                         
                // Etape 2: On récupère Module, Objet et éventuellement Nom (de l'alias)
             
            $nomModule = preg_replace('#(\D[a-z]+) [decu].+)#i', '$1', $alias);
                         
            if (preg_match('#(.+)\|(.+)#i', $alias)) // S'il y a un nom d'alias renseigné
            {
                $nomObjet = preg_replace('#('.$nomModule.') [decu].+)\|(.+)#i', '$2', $alias);
                $nomAlias = preg_replace('#(.+)\|(.+)#i', '$2', $alias);
            }
            else // S'il n'y en a pas (renvoit de chaîne vide obligatoire pour $nomAlias)
            {
                $nomObjet = preg_replace('#('.$nomModule.') [decu].+)#', '$2', $alias);
                $nomAlias = '';
            }
             
                // Etape 3: On récupère le module:
             
            $module = $moduleManager->get(Manager::SEARCH_BY_NOM, array('nom' => $nomModule));
             
                // Etape 4: On récupère l'objet (forcément renseigné depuis la création automatique de fantômes)
             
            $xManagerNom = $module->getNom().'Manager';
            $xManager = new $xManagerNom($this->_bdd);
                         
            if ($xManager->exists(Manager::SEARCH_BY_NOM, array('nom' => $nomObjet))) // Si l'objet existe, on le récupère
            {
                $objet = $xManager->get(Manager::SEARCH_BY_NOM, array('nom' => $nomObjet));
            }
            else // Sinon, on le crée
            {
                $nomModule = $module->getNom();
                 
                $objet = new $nomModule(array('statut' => $nomModule::ST_NEX,
                                              'nom' => $nomObjet));
         
                $objet = $xManager->add($objet);
            }
                                 
                // Etape 5: On vérifie si l'alias existe déjà, et s'il n'existe pas on le crée
            if($this->exists(Manager::SEARCH_BY_XID, array('idModule' => $module->getId(),
                                                           'idObjet' => $objet->getId(),
                                                           'nom' => $nomAlias)))
            {
                $alias = $this->get(Manager::SEARCH_BY_XID, array('idModule' => $module->getId(),
                                                                  'idObjet' => $objet->getId(),
                                                                  'nom' => $nomAlias));
            }
            else
            {
                $alias = new Alias(array('idReference' => '0',
                                         'idModule' => $module->getId(),
                                         'idObjet' => $objet->getId(),
                                         'nom' => $nomAlias));
                 
                $alias = $this->add($alias);
            }
                         
            $aliases[$bracket] = '@'.$alias->getId();
        }
         
        return $aliases;
    }
Bonjour,

Déjà, vos regex ne sont pas valides, des parenthèses manquent. Je passe sur les \D et [ decu], je n'ai pas cherché à comprendre.
EDIT : ok alors en fait on dirait bien que c'est le forum qui rajoute des choses, [ decu ] étant une emoticone.

Ensuite, selon la provenance et donc la fiabilité du pattern, deux split (avec "|" pour commencer, avec ":" ensuite) peuvent suffire à isoler les éléments. Si vous avez besoin de plus de contrôle sur ce pattern, un seul preg_match, avec les captures ad hoc, suffit également, et en prime il évite l'étape de suppression des crochets (tout en vérifiant qu'ils sont présents).
preg_match("/^\\[\\[([^:]+) : ([^\\|]+)(?:\\|(.+))?\\]\\]$/i", "[[NomDeModule:NomObjet|TexteDeRemplacement]]", $matches);
// Dans $matches : Capture globale : [[NomDeModule:NomObjet|TexteDeRemplacement]]
// Groupe de capture 1 : NomDeModule
// Groupe de capture 2 : NomObjet
// Groupe de capture 3 : TexteDeRemplacement

Note : du coup j'ai mis des espaces autour des ":" pour éviter l'interprétation par le forum, il faudra les enlever.
S'il n'y a pas d'alias, vous n'aurez que deux groupes de capture.
J'ai utilisé des classes négatives pour éviter du backtracking inutile.
a+
Modifié par Seven tears (24 Jul 2017 - 11:08)