Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/08/2006, 11h23   #1
Nouveau Membre du Club
 
Avatar de gaboo_bl
 
Inscription : août 2006
Messages : 67
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : août 2006
Messages : 67
Points : 37
Points : 37
Par défaut Besoin d'un coup de main pour écrire une regex

Bonjour à tous,

j'ai besoin d'un coup de main pour écrire un masque dans preg_replace, je vous explique le problème:
J'ai en entrant une chaîne contenant au moins une requête SQL. Cette chaine peut être multi lignes. Je voudrais, dans les clauses select ... from, remplacer les virgules qui séparent les colonnes par des ||, afin que la sortie de la requête dans sqlplus se fasse sur une ligne.
Difficulté supplémentaire, il ne faut pas que les virgules qui se trouvent dans des parenthèses soient modifiées (car ce sont des séparateurs pour les paramètres de fonctions to_char(),...)
J'ai déjà passé pas mal de temps dessus, mais je ne trouve pas: si quelqu'un à une idée...
Je suis sur PHP 4.3.4 et Oracle 9.2.
Merci
gaboo_bl est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2006, 11h25   #2
Rédacteur
 
Avatar de Yoshio
 
Homme
Inscription : septembre 2005
Messages : 1 741
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : Belgique

Informations forums :
Inscription : septembre 2005
Messages : 1 741
Points : 1 497
Points : 1 497
donne nous un exemple de la chaine a modifier et ce qu'elle devra etre apres modification


Chaine originale :
Code :
SELECT champ1, champ2, champ3 FROM table WHERE champ1='exemple'
Chaine modifiée ?!

Code :
SELECT champ1||champ2||champ3 FROM table WHERE champ1='exemple'
C'est bien ca ?!
Yoshio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2006, 11h52   #3
Nouveau Membre du Club
 
Avatar de gaboo_bl
 
Inscription : août 2006
Messages : 67
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : août 2006
Messages : 67
Points : 37
Points : 37
Oui, c'est tout à fait çà, sauf que l'on peut aussi avoir des choses du genre:
Code :
1
2
3
4
5
6
7
8
 
SELECT champ1,
             champ2, 
             to_char(champ3,'YYYYMM'),
From table 
where champ1='exemple';
 
select ...--une autre requête
et que la chaine peut contenir plusieurs requêtes à la suite.
J'ai omis de préciser que les mots clés peuvent en majuscule ou en minuscule, mais c'est parce que j'ai réglé ce problème avec l'option i.
gaboo_bl est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2006, 12h17   #4
Rédacteur
 
Avatar de Yoshio
 
Homme
Inscription : septembre 2005
Messages : 1 741
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : Belgique

Informations forums :
Inscription : septembre 2005
Messages : 1 741
Points : 1 497
Points : 1 497
Pour simpelment remplacer les virgule par || sans se soucier des fonctrion :

Code :
$str = preg_replace('`,([[:space:]])*`', '||', $str);
Tu devrais l'avoir celui la lol (je continue a chercher pour l'autre)
Yoshio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2006, 12h46   #5
Nouveau Membre du Club
 
Avatar de gaboo_bl
 
Inscription : août 2006
Messages : 67
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : août 2006
Messages : 67
Points : 37
Points : 37
Oui ce morceau là fonctionne, je ne pensais pas que la classe :space: comprenait le retour chariot.
Par contre je viens de m'apercevoir que j'ai oublié un point essentiel: Il arrive que j'ai des vues inline dans mes fichiers de requêtes, ce qui donne la syntaxe suivante:
Code :
1
2
3
4
5
6
 
select champ1,
champ2
from (SELECT champ1, champ2 from table) vue_inline, table2
where 
etc...
et pour ces sous-requêtes, je ne dois pas changer les virgules par des ||.
De même les virgules qui séparent les noms des tables ne doivent pas être remplacées.

- Les vues inline nécessite automatiquement des parenthèses, donc si l'on trouve quelque chose pour éviter le remplacement dans les fonctions basé sur les parenthèses, y a de fortes chances pour que çà marche aussi dans ce cas,

- pour la liste des tables, elle est toujours délimitée par from...where ou from...;
Là c'est plus compliqué, je pense qu'il vaut mieux prendre la règle inverse:
les virgules à remplacer sont encadrées par select...from

En résumé mes règles de gestions sont:
Remplacer toutes les virgules de la chaîne par ||:
- qui se trouve quelque part entre un select et un from
- qui ne se trouvent pas quelque part entre une parenthèse ouvrante et une parenthèse fermante.


De quoi se donner mal au crâne, non?
gaboo_bl est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2006, 12h48   #6
Rédacteur
 
Avatar de Yoshio
 
Homme
Inscription : septembre 2005
Messages : 1 741
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : Belgique

Informations forums :
Inscription : septembre 2005
Messages : 1 741
Points : 1 497
Points : 1 497
Je pense pas que ca soit possible seulement avec des regex et preg_replace.

Si c'est possible ca dépasse de loin mes compétence la dedans lol

A la rigueur tu pourrais faire un explode() de ta chaine sur SELECT ... FROM. Et tu n'appliquerais que la le preg_replace. Apres tu fait un implode() pour revenir à la normal.

EDIT : preg_split() plutot
Yoshio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2006, 14h25   #7
Rédacteur
 
Avatar de wamania
 
Développeur Web
Inscription : juillet 2003
Messages : 676
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : juillet 2003
Messages : 676
Points : 678
Points : 678
Une solution, en utilisant le Séparateur de requète, un code des sources présentes sur le site
http://php.developpez.com/sources/


Code :
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<?php
 
function explode_parser( $str, $delimiter=',')
{
    $len = strlen($str);
 
    for ($i = 0,$in_delimiter = true,$quote_is_begin = false,$tab = array(),$tmp = ''; $i < $len; $i++)
    {
        if ($str{$i} != $delimiter || ($quote_is_begin && $str{$i} == $delimiter))
        {
            if ($str{$i} == "(" && !$quote_is_begin)
            {
                $quote_is_begin = TRUE;
            }
            else if ($str{$i} == ")" && $quote_is_begin && $str{$i - 1} != '\\')
            {
                $quote_is_begin = FALSE;
            }
            $tmp .= $str{$i};
            $in_delimiter = FALSE;
        }
        else if ($str{$i} == $delimiter && !$in_delimiter && !$quote_is_begin)
        {
            $in_delimiter = TRUE;
            if (strlen($tmp) > 0)
            {
                $tab[] = $tmp;
            }
            $tmp = '';
        }  
    }
 
    if (strlen($tmp) > 0)
    {
        $tab[] = $tmp;
    }
    return ($tab);
}
 
 
$q = "select champ1,
champ2, to_char(champ3,'YYYYMM')
from (SELECT champ1, champ2 from table) vue_inline, table2
where ";
 
$tabQ = array();
preg_match("/^SELECT([a-zA-Z0-9_,\s()']+?)FROM/i", $q, $tabQ);
$tabQ = explode_parser($tabQ['1'], ',');
 
$tabQ = array_map('trim', $tabQ);
$strQ = implode('||', $tabQ);
 
$q = preg_replace("/^SELECT([a-zA-Z0-9_,\s()']+?)FROM/i", 'SELECT '.$strQ.' FROM', $q);
echo $q;
?>
__________________
Articles sur developpez.com
- Gestion des exceptions avec PHP5
- Chiffrement et hash en PHP contre l'attaque Man in the middle
- Aedituus - Espace membre sécurisé en PHP5

Lithium : ORM ActiveRecord PHP5 extrêmement léger
wamania est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2006, 17h53   #8
Nouveau Membre du Club
 
Avatar de gaboo_bl
 
Inscription : août 2006
Messages : 67
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : août 2006
Messages : 67
Points : 37
Points : 37
OK, j'avais d'autre truc à résoudre cet aprés midi, et je n'ai pas eu le temps d'essayer çà. Il semble de toute façon qu'on obtienne le résultat voulu sans faire cette modif, je n'en aurais donc finalement pas besoin.
Merci en tout cas à tous les deux pour vos réponses, je passe en résolu.
gaboo_bl est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h22.


 
 
 
 
Partenaires

Hébergement Web