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
---
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) où $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 !
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
---
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) où $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;
}