Question

J'essaie donc de créer un script qui ajoute automatiquement des noms de colonne valides à un préfixe de table approprié (par exemple, "t." ou "r.")

$t_columns = array('id', 'name', 'label');
$r_columns = array('related_value');

INPUT:

id > 1 AND (name = 'Hello' OR label IN ('World', 'Planet name AND label')) AND (related_value > 1 AND related_value < 50)

SORTIE:

t.id > 1 AND (t.name = 'Hello' OR t.label IN ('World', 'Planet name AND label')) AND (r.related_value > 1 AND r.related_value < 50)

Notez que vous ne pouvez pas créer un remplacement_str_ normal. Quel serait le code le plus simple ( preg_replace ) pour garantir que tous les noms de table sont correctement ajoutés à la liste?

Était-ce utile?

La solution

Cela peut être fait de nombreuses manières, et aussi en utilisant regex. Personnellement, je voudrais utiliser une approche de tableau. Tout d’abord, je définirais la table de jeu comme suit:

$table = array(
    'id' => 't.id',
    'name' => 't.name',
    'label' => 't.label',
    'related_value' => 'r.related_value'
);

Cela facilitera beaucoup l'appel str_replace ():

function mangling(&$v, $k, $table)
{
    if (($k & 1) == 0)
        $v = str_replace(array_keys($table), array_values($table), $v);
}

$spans = explode("'", ' ' . $input);
array_walk($spans, 'mangling', $table);
$output = implode("'", $spans);

Autres conseils

Après quelques secondes de réflexion, voici comment j'y remédier:

Parcourez la chaîne, caractère par caractère, à la recherche de guillemets simples, mais en sautant les caractères échappés. Le texte entre deux guillemets simples non échappés (c'est-à-dire les chaînes) serait remplacé par un jeton unique et placé dans un tableau associatif, avec ce jeton comme clé et la chaîne d'origine comme valeur.

Maintenant que nous avons les chaînes, faites un str_replace () (ou preg_replace () , si vous insistez) pour les noms de colonne connus. Je construirais probablement les noms de colonne dans un tableau associatif, avec l'alias de la table comme clé et la valeur sous forme d'un tableau énuméré contenant les noms de colonne. De cette manière, le remplacement pourrait être automatisé.

Une fois les noms de table renseignés, il suffit de faire un str_replace () pour les jetons, afin de replacer les chaînes d'origine à leur place, et vous avez terminé.

Je suis sûr que quelqu'un pourrait fouetter une expression rationnelle géniale (et probablement presque intangible) pour faire tout cela en un seul coup. Mais je préfère utiliser les expressions rationnelles uniquement dans les situations où les expressions régulières sont en fait le bon outil, et non dans les cas où une CFL serait plus appropriée.

Je ne sais pas si une expression régulière est une bonne idée ici. Je dirais que cela vaudrait la peine d'augmenter la complexité informatique accrue pour effectuer la validation vous-même en PHP. Ensuite, si votre base de données nécessite des modifications, vous ne serez plus obligé de vous dénigrer et de vous inquiéter de la manière d’augmenter la robustesse de votre expression régulière.

Comme le disait Jamie Zawinski, "Certaines personnes, confrontées à un problème, se disent:" Je sais, je vais utiliser des expressions régulières ". Maintenant, ils ont deux problèmes. "

En ce qui concerne la création d'un flux de travail garantissant que vous travaillez sur la bonne base de données, j'aimerais envisager une approche orientée objet. Les classes pour les tables T et R peuvent être des enfants instanciés d’une classe de modèle chargée de créer le bon objet de type table en utilisant une logique conditionnelle au sein de la même méthode, plutôt qu’une expression régulière.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top