J'avais des difficultés ptratique avec la version précédente, qui
n'était pas strictement automatique, car elle nécessitait des
vérifications manuelles.
Il semble que j'ai réussi à mettre au point une version entièrement
automatique, qui donne des messages d'erreurs quand il y a des erreurs,
dans le fihcier /root/tmp.txt Quand ce fichier ne contient que les
fichiers migrés, ( pas de token Erreur ) il n'y a pas d'erreur durant la
migration.
Voici le code :
D'abord, le filtre filtre.awk
-----------------------------------------------------------
function change(param)
{
# Fin d'expression rationnelle
# trouvée.
fin_trouve=0;
# Quote simple ou double
# de fin d'expression
# rationnelle partielle
# ou globale.
quote_trouve=0;
p=split(param, tableau, "");
# n = nombre de caractères backslashes
# ( ) rencontrés.
n=0;
# Initialisation
# du premier paramètre
# de la fonction pcre.
chaine=""/".";
for(i=1; i<=p; i++)
{
t=tableau[i];
if(t=="$")
{
quote_trouve=0;
# On suppose que les variables
# sont toujours accolées
# aux autres expressions,
# par un point, et que
# leurs noms ne contiennent pas
# de point.
while((i<=p)&&(t!=".")&&(t!=","))
{
# Pas d'espace
# dans un nom de variable.
if((t!=" ")&&(t!="t"))
chaine=chaine t;
i++;
t=tableau[i];
}
if(i>p)
{
# Fin de tableau[i]
# rencontré, sans
# atteindre la fin
# de l'expression rationnelle,
# donc erreur.
print "Erreur: expression rationnelle sur plusieurs lignes: " param
" " chaine > "/dev/stderr";
[...]
else if((t=="t")||(t=="c"))
{
if(t=="t")
{
# début de trim(
pattern="trim";
}
else
{
# Début de chr(
pattern="chr";
}
w=split(pattern, tab, "");
[...]
else if((t==""")||(t=="'"))
{
chaine=chaine t;
# Mémorisation du type de quote
# ( double ou simple )
# encadrant l'expression
# rationnelle.
s=t;
i++;
t=tableau[i];
while((i<=p)&&(quote_trouve==0))
{
if(t=="")
{
n++;
}
else
{
for(x=1; x<=n; x++)
chaine=chaine "";
q=n;
indic=0;
# Echappement
# au cas où.
if((n>0)&&((2*int(q/2.0))==n)&&((t=="&")||(t=="+")||(t==s)))
[...]
J'avais des difficultés ptratique avec la version précédente, qui
n'était pas strictement automatique, car elle nécessitait des
vérifications manuelles.
Il semble que j'ai réussi à mettre au point une version entièrement
automatique, qui donne des messages d'erreurs quand il y a des erreurs,
dans le fihcier /root/tmp.txt Quand ce fichier ne contient que les
fichiers migrés, ( pas de token Erreur ) il n'y a pas d'erreur durant la
migration.
Voici le code :
D'abord, le filtre filtre.awk
-----------------------------------------------------------
function change(param)
{
# Fin d'expression rationnelle
# trouvée.
fin_trouve=0;
# Quote simple ou double
# de fin d'expression
# rationnelle partielle
# ou globale.
quote_trouve=0;
p=split(param, tableau, "");
# n = nombre de caractères backslashes
# ( ) rencontrés.
n=0;
# Initialisation
# du premier paramètre
# de la fonction pcre.
chaine=""/".";
for(i=1; i<=p; i++)
{
t=tableau[i];
if(t=="$")
{
quote_trouve=0;
# On suppose que les variables
# sont toujours accolées
# aux autres expressions,
# par un point, et que
# leurs noms ne contiennent pas
# de point.
while((i<=p)&&(t!=".")&&(t!=","))
{
# Pas d'espace
# dans un nom de variable.
if((t!=" ")&&(t!="t"))
chaine=chaine t;
i++;
t=tableau[i];
}
if(i>p)
{
# Fin de tableau[i]
# rencontré, sans
# atteindre la fin
# de l'expression rationnelle,
# donc erreur.
print "Erreur: expression rationnelle sur plusieurs lignes: " param
" " chaine > "/dev/stderr";
[...]
else if((t=="t")||(t=="c"))
{
if(t=="t")
{
# début de trim(
pattern="trim";
}
else
{
# Début de chr(
pattern="chr";
}
w=split(pattern, tab, "");
[...]
else if((t==""")||(t=="'"))
{
chaine=chaine t;
# Mémorisation du type de quote
# ( double ou simple )
# encadrant l'expression
# rationnelle.
s=t;
i++;
t=tableau[i];
while((i<=p)&&(quote_trouve==0))
{
if(t=="\")
{
n++;
}
else
{
for(x=1; x<=n; x++)
chaine=chaine "\";
q=n;
indic=0;
# Echappement
# au cas où.
if((n>0)&&((2*int(q/2.0))==n)&&((t=="&")||(t=="+")||(t==s)))
[...]
J'avais des difficultés ptratique avec la version précédente, qui
n'était pas strictement automatique, car elle nécessitait des
vérifications manuelles.
Il semble que j'ai réussi à mettre au point une version entièrement
automatique, qui donne des messages d'erreurs quand il y a des erreurs,
dans le fihcier /root/tmp.txt Quand ce fichier ne contient que les
fichiers migrés, ( pas de token Erreur ) il n'y a pas d'erreur durant la
migration.
Voici le code :
D'abord, le filtre filtre.awk
-----------------------------------------------------------
function change(param)
{
# Fin d'expression rationnelle
# trouvée.
fin_trouve=0;
# Quote simple ou double
# de fin d'expression
# rationnelle partielle
# ou globale.
quote_trouve=0;
p=split(param, tableau, "");
# n = nombre de caractères backslashes
# ( ) rencontrés.
n=0;
# Initialisation
# du premier paramètre
# de la fonction pcre.
chaine=""/".";
for(i=1; i<=p; i++)
{
t=tableau[i];
if(t=="$")
{
quote_trouve=0;
# On suppose que les variables
# sont toujours accolées
# aux autres expressions,
# par un point, et que
# leurs noms ne contiennent pas
# de point.
while((i<=p)&&(t!=".")&&(t!=","))
{
# Pas d'espace
# dans un nom de variable.
if((t!=" ")&&(t!="t"))
chaine=chaine t;
i++;
t=tableau[i];
}
if(i>p)
{
# Fin de tableau[i]
# rencontré, sans
# atteindre la fin
# de l'expression rationnelle,
# donc erreur.
print "Erreur: expression rationnelle sur plusieurs lignes: " param
" " chaine > "/dev/stderr";
[...]
else if((t=="t")||(t=="c"))
{
if(t=="t")
{
# début de trim(
pattern="trim";
}
else
{
# Début de chr(
pattern="chr";
}
w=split(pattern, tab, "");
[...]
else if((t==""")||(t=="'"))
{
chaine=chaine t;
# Mémorisation du type de quote
# ( double ou simple )
# encadrant l'expression
# rationnelle.
s=t;
i++;
t=tableau[i];
while((i<=p)&&(quote_trouve==0))
{
if(t=="")
{
n++;
}
else
{
for(x=1; x<=n; x++)
chaine=chaine "";
q=n;
indic=0;
# Echappement
# au cas où.
if((n>0)&&((2*int(q/2.0))==n)&&((t=="&")||(t=="+")||(t==s)))
[...]
Bonjour Jean-François,
Je n'ai lu que ça, et même que la fonction change() de ce script. Je
n'en ai eu le courage que parce que tu as abondamment commenté ce code,
ce dont je te remercie.-----------------------------------------------------------
p=split(param, tableau, "");
Attention, ceci n'est pas portable : c'est un gnuisme (code spécifique
gnu). Sur les versions de awk différentes de gawk, rien ne dit comment
on doit traiter le cas où le 3e paramètre de split() est une chaîne
vide.
# Initialisation
# du premier paramètre
# de la fonction pcre.
chaine=""/".";
Il m'a fallu quelques secondes pour comprendre cette ligne.
Personnellement j'aurais écrit :
chaine = '"/" . ';
Au fait, il y a ici une supposition implicite, à savoir que la regexp
posix ne contient jamais aucun caractère « / », aussi bien écrit de
façon littérale que caché dans une variable.
for(i=1; i<=p; i++)
{
t=tableau[i];
if(t=="$")
{
quote_trouve=0;
# On suppose que les variables
# sont toujours accolées
# aux autres expressions,
# par un point, et que
# leurs noms ne contiennent pas
# de point.
Ceci est une autre supposition qui correspond certainement à ton propre
code, mais pas forcément aux code des autres (il suffit de voir comme tu
n'as mis aucune espace dans la ligne qui suit alors que moi j'en aurais
mis exactement onze !)
while((i<=p)&&(t!=".")&&(t!=","))
{
# Pas d'espace
# dans un nom de variable.
if((t!=" ")&&(t!="t"))
chaine=chaine t;
... et si jamais le code d'origine avait le mauvais goût de contenir des
espaces après un nom de variable, elles seront impitoyablement virées
par la transformation ! ;-)
i++;
t=tableau[i];
}
if(i>p)
{
# Fin de tableau[i]
# rencontré, sans
# atteindre la fin
# de l'expression rationnelle,
# donc erreur.
print "Erreur: expression rationnelle sur plusieurs lignes: " param
" " chaine> "/dev/stderr";
Sauf erreur, «> &2 » me semble plus portable que «> /dev/stderr ».
Mais je peux me tromper.
[...]
else if((t=="t")||(t=="c"))
{
if(t=="t")
{
# début de trim(
pattern="trim";
}
else
{
# Début de chr(
pattern="chr";
}
Ok, ceci est un code très spécifique à tes propres habitudes, mais vu
que c'est bien documenté il doit être facile de rajouter d'autres
fonctions selon les besoins de chacun.
w=split(pattern, tab, "");
Même gnuisme que signalé plus haut.
[...]
else if((t==""")||(t=="'"))
{
chaine=chaine t;
# Mémorisation du type de quote
# ( double ou simple )
# encadrant l'expression
# rationnelle.
s=t;
i++;
t=tableau[i];
while((i<=p)&&(quote_trouve==0))
{
if(t=="")
{
n++;
}
J'avoue que je n'ai pas compris le traitement des « » :
- pourquoi tu comptes le nombre de tous les successifs au lieu de les
recopier dans 'chaine' dès que tu en as deux d'affilée ;
- comment tu gères les $, " et '.
else
{
for(x=1; x<=n; x++)
chaine=chaine "";
q=n;
indic=0;
# Echappement
# au cas où.
if((n>0)&&((2*int(q/2.0))==n)&&((t=="&")||(t=="+")||(t==s)))
Est-ce que le test ((2*int(q/2.0))==n) ne pourrait pas être remplacé
tout simplement par (n%2==0) ?
[...]
etc.
Voilà. Pour le reste, vu que je n'ai aucune regexp POSIX dans mes
quelques rares scripts, je ne suis pas intéressé pour moi-même. Mais
encore une fois merci pour ceux qui sont dans le même cas que toi, en
espérant que mes quelques remarques pourront leur être utiles si jamais
ils n'avaient pas les mêmes habitudes de programmation que toi.
Cordialement,
Bonjour Jean-François,
Je n'ai lu que ça, et même que la fonction change() de ce script. Je
n'en ai eu le courage que parce que tu as abondamment commenté ce code,
ce dont je te remercie.
-----------------------------------------------------------
p=split(param, tableau, "");
Attention, ceci n'est pas portable : c'est un gnuisme (code spécifique
gnu). Sur les versions de awk différentes de gawk, rien ne dit comment
on doit traiter le cas où le 3e paramètre de split() est une chaîne
vide.
# Initialisation
# du premier paramètre
# de la fonction pcre.
chaine=""/".";
Il m'a fallu quelques secondes pour comprendre cette ligne.
Personnellement j'aurais écrit :
chaine = '"/" . ';
Au fait, il y a ici une supposition implicite, à savoir que la regexp
posix ne contient jamais aucun caractère « / », aussi bien écrit de
façon littérale que caché dans une variable.
for(i=1; i<=p; i++)
{
t=tableau[i];
if(t=="$")
{
quote_trouve=0;
# On suppose que les variables
# sont toujours accolées
# aux autres expressions,
# par un point, et que
# leurs noms ne contiennent pas
# de point.
Ceci est une autre supposition qui correspond certainement à ton propre
code, mais pas forcément aux code des autres (il suffit de voir comme tu
n'as mis aucune espace dans la ligne qui suit alors que moi j'en aurais
mis exactement onze !)
while((i<=p)&&(t!=".")&&(t!=","))
{
# Pas d'espace
# dans un nom de variable.
if((t!=" ")&&(t!="t"))
chaine=chaine t;
... et si jamais le code d'origine avait le mauvais goût de contenir des
espaces après un nom de variable, elles seront impitoyablement virées
par la transformation ! ;-)
i++;
t=tableau[i];
}
if(i>p)
{
# Fin de tableau[i]
# rencontré, sans
# atteindre la fin
# de l'expression rationnelle,
# donc erreur.
print "Erreur: expression rationnelle sur plusieurs lignes: " param
" " chaine> "/dev/stderr";
Sauf erreur, «> &2 » me semble plus portable que «> /dev/stderr ».
Mais je peux me tromper.
[...]
else if((t=="t")||(t=="c"))
{
if(t=="t")
{
# début de trim(
pattern="trim";
}
else
{
# Début de chr(
pattern="chr";
}
Ok, ceci est un code très spécifique à tes propres habitudes, mais vu
que c'est bien documenté il doit être facile de rajouter d'autres
fonctions selon les besoins de chacun.
w=split(pattern, tab, "");
Même gnuisme que signalé plus haut.
[...]
else if((t==""")||(t=="'"))
{
chaine=chaine t;
# Mémorisation du type de quote
# ( double ou simple )
# encadrant l'expression
# rationnelle.
s=t;
i++;
t=tableau[i];
while((i<=p)&&(quote_trouve==0))
{
if(t=="\")
{
n++;
}
J'avoue que je n'ai pas compris le traitement des « » :
- pourquoi tu comptes le nombre de tous les successifs au lieu de les
recopier dans 'chaine' dès que tu en as deux d'affilée ;
- comment tu gères les $, " et '.
else
{
for(x=1; x<=n; x++)
chaine=chaine "\";
q=n;
indic=0;
# Echappement
# au cas où.
if((n>0)&&((2*int(q/2.0))==n)&&((t=="&")||(t=="+")||(t==s)))
Est-ce que le test ((2*int(q/2.0))==n) ne pourrait pas être remplacé
tout simplement par (n%2==0) ?
[...]
etc.
Voilà. Pour le reste, vu que je n'ai aucune regexp POSIX dans mes
quelques rares scripts, je ne suis pas intéressé pour moi-même. Mais
encore une fois merci pour ceux qui sont dans le même cas que toi, en
espérant que mes quelques remarques pourront leur être utiles si jamais
ils n'avaient pas les mêmes habitudes de programmation que toi.
Cordialement,
Bonjour Jean-François,
Je n'ai lu que ça, et même que la fonction change() de ce script. Je
n'en ai eu le courage que parce que tu as abondamment commenté ce code,
ce dont je te remercie.-----------------------------------------------------------
p=split(param, tableau, "");
Attention, ceci n'est pas portable : c'est un gnuisme (code spécifique
gnu). Sur les versions de awk différentes de gawk, rien ne dit comment
on doit traiter le cas où le 3e paramètre de split() est une chaîne
vide.
# Initialisation
# du premier paramètre
# de la fonction pcre.
chaine=""/".";
Il m'a fallu quelques secondes pour comprendre cette ligne.
Personnellement j'aurais écrit :
chaine = '"/" . ';
Au fait, il y a ici une supposition implicite, à savoir que la regexp
posix ne contient jamais aucun caractère « / », aussi bien écrit de
façon littérale que caché dans une variable.
for(i=1; i<=p; i++)
{
t=tableau[i];
if(t=="$")
{
quote_trouve=0;
# On suppose que les variables
# sont toujours accolées
# aux autres expressions,
# par un point, et que
# leurs noms ne contiennent pas
# de point.
Ceci est une autre supposition qui correspond certainement à ton propre
code, mais pas forcément aux code des autres (il suffit de voir comme tu
n'as mis aucune espace dans la ligne qui suit alors que moi j'en aurais
mis exactement onze !)
while((i<=p)&&(t!=".")&&(t!=","))
{
# Pas d'espace
# dans un nom de variable.
if((t!=" ")&&(t!="t"))
chaine=chaine t;
... et si jamais le code d'origine avait le mauvais goût de contenir des
espaces après un nom de variable, elles seront impitoyablement virées
par la transformation ! ;-)
i++;
t=tableau[i];
}
if(i>p)
{
# Fin de tableau[i]
# rencontré, sans
# atteindre la fin
# de l'expression rationnelle,
# donc erreur.
print "Erreur: expression rationnelle sur plusieurs lignes: " param
" " chaine> "/dev/stderr";
Sauf erreur, «> &2 » me semble plus portable que «> /dev/stderr ».
Mais je peux me tromper.
[...]
else if((t=="t")||(t=="c"))
{
if(t=="t")
{
# début de trim(
pattern="trim";
}
else
{
# Début de chr(
pattern="chr";
}
Ok, ceci est un code très spécifique à tes propres habitudes, mais vu
que c'est bien documenté il doit être facile de rajouter d'autres
fonctions selon les besoins de chacun.
w=split(pattern, tab, "");
Même gnuisme que signalé plus haut.
[...]
else if((t==""")||(t=="'"))
{
chaine=chaine t;
# Mémorisation du type de quote
# ( double ou simple )
# encadrant l'expression
# rationnelle.
s=t;
i++;
t=tableau[i];
while((i<=p)&&(quote_trouve==0))
{
if(t=="")
{
n++;
}
J'avoue que je n'ai pas compris le traitement des « » :
- pourquoi tu comptes le nombre de tous les successifs au lieu de les
recopier dans 'chaine' dès que tu en as deux d'affilée ;
- comment tu gères les $, " et '.
else
{
for(x=1; x<=n; x++)
chaine=chaine "";
q=n;
indic=0;
# Echappement
# au cas où.
if((n>0)&&((2*int(q/2.0))==n)&&((t=="&")||(t=="+")||(t==s)))
Est-ce que le test ((2*int(q/2.0))==n) ne pourrait pas être remplacé
tout simplement par (n%2==0) ?
[...]
etc.
Voilà. Pour le reste, vu que je n'ai aucune regexp POSIX dans mes
quelques rares scripts, je ne suis pas intéressé pour moi-même. Mais
encore une fois merci pour ceux qui sont dans le même cas que toi, en
espérant que mes quelques remarques pourront leur être utiles si jamais
ils n'avaient pas les mêmes habitudes de programmation que toi.
Cordialement,
Bonjour Monsieur-----------------------------------------------------------
p=split(param, tableau, "");
Attention, ceci n'est pas portable : c'est un gnuisme (code spécifique
gnu). Sur les versions de awk différentes de gawk, rien ne dit comment
on doit traiter le cas où le 3e paramètre de split() est une chaîne
vide.
Effectivement, je ne savais pas cela.
Au départ, je sélectionnais les caractères de la chaîne param avec la
fonction substr(), mais je me suis aperçu qu'elle ne prenait pas laes
voyelles accentuées ( en ascii, pas en utf-8, je n'ai pas essayé pour
l'utf-8 ).
Au fait, il y a ici une supposition implicite, à savoir que la regexp
posix ne contient jamais aucun caractère « / », aussi bien écrit de
façon littérale que caché dans une variable.
J'ai surtout supposé, que tous les caractères "/" étaient échappés dans
la regexp.
Bonjour Monsieur
-----------------------------------------------------------
p=split(param, tableau, "");
Attention, ceci n'est pas portable : c'est un gnuisme (code spécifique
gnu). Sur les versions de awk différentes de gawk, rien ne dit comment
on doit traiter le cas où le 3e paramètre de split() est une chaîne
vide.
Effectivement, je ne savais pas cela.
Au départ, je sélectionnais les caractères de la chaîne param avec la
fonction substr(), mais je me suis aperçu qu'elle ne prenait pas laes
voyelles accentuées ( en ascii, pas en utf-8, je n'ai pas essayé pour
l'utf-8 ).
Au fait, il y a ici une supposition implicite, à savoir que la regexp
posix ne contient jamais aucun caractère « / », aussi bien écrit de
façon littérale que caché dans une variable.
J'ai surtout supposé, que tous les caractères "/" étaient échappés dans
la regexp.
Bonjour Monsieur-----------------------------------------------------------
p=split(param, tableau, "");
Attention, ceci n'est pas portable : c'est un gnuisme (code spécifique
gnu). Sur les versions de awk différentes de gawk, rien ne dit comment
on doit traiter le cas où le 3e paramètre de split() est une chaîne
vide.
Effectivement, je ne savais pas cela.
Au départ, je sélectionnais les caractères de la chaîne param avec la
fonction substr(), mais je me suis aperçu qu'elle ne prenait pas laes
voyelles accentuées ( en ascii, pas en utf-8, je n'ai pas essayé pour
l'utf-8 ).
Au fait, il y a ici une supposition implicite, à savoir que la regexp
posix ne contient jamais aucun caractère « / », aussi bien écrit de
façon littérale que caché dans une variable.
J'ai surtout supposé, que tous les caractères "/" étaient échappés dans
la regexp.
Au départ, je sélectionnais les caractères de la chaîne param avec la
fonction substr(), mais je me suis aperçu qu'elle ne prenait pas laes
voyelles accentuées ( en ascii, pas en utf-8, je n'ai pas essayé pour
l'utf-8 ).
Je vous demande pardon, j'ai fait un lapsus linguae. ;)
Ce n'était effectivement pas la fonction substr() que j'ai essayé
d'utiliser, mais la fonction sub(). Celle-ci ne prenait pas les voyelles
accentuées. Je ne sais pas quelle fonction prendre pour sélectionner un
par un tous les caractères d'une chaîne ascii éventuellement étendu.
Au fait, il y a ici une supposition implicite, à savoir que la regexp
posix ne contient jamais aucun caractère « / », aussi bien écrit de
façon littérale que caché dans une variable.
J'ai surtout supposé, que tous les caractères "/" étaient échappés dans
la regexp.
Pour résoudre le problème du premier et du dernier caractère de la
regexp modifiée ( == standard pcre ), et pour éviter le cas où il y a
plusieurs caractères "/" "/" accolés, je pense que ce serait correct
d'utiliser le caractère dièze ( # ), et d'encadrer l'ensemble de la
regexp migrée ( sans les # de début et de fin ), par une fonction
preg_replace().
Cette fonction preg_replace évaluerait le contenu de la regexp après
migration ( == obtenue au moment du test final if(fin_trouve==1) ), et
qui remplace toutes les occurences de dièze précédés par un nombre x
pair ou nul de "", par x fois "" suivi de "#'. Cela revient à
échapper tous les dièzes qui ne le sont pas, et résoudrait le problème
de l'existence éventuelle de ce signe dièze dans la regexp.
Le seul problème, est que je ne sais pas comment faire un tel
remplacement avec preg_replace().
Au départ, je sélectionnais les caractères de la chaîne param avec la
fonction substr(), mais je me suis aperçu qu'elle ne prenait pas laes
voyelles accentuées ( en ascii, pas en utf-8, je n'ai pas essayé pour
l'utf-8 ).
Je vous demande pardon, j'ai fait un lapsus linguae. ;)
Ce n'était effectivement pas la fonction substr() que j'ai essayé
d'utiliser, mais la fonction sub(). Celle-ci ne prenait pas les voyelles
accentuées. Je ne sais pas quelle fonction prendre pour sélectionner un
par un tous les caractères d'une chaîne ascii éventuellement étendu.
Au fait, il y a ici une supposition implicite, à savoir que la regexp
posix ne contient jamais aucun caractère « / », aussi bien écrit de
façon littérale que caché dans une variable.
J'ai surtout supposé, que tous les caractères "/" étaient échappés dans
la regexp.
Pour résoudre le problème du premier et du dernier caractère de la
regexp modifiée ( == standard pcre ), et pour éviter le cas où il y a
plusieurs caractères "/" "/" accolés, je pense que ce serait correct
d'utiliser le caractère dièze ( # ), et d'encadrer l'ensemble de la
regexp migrée ( sans les # de début et de fin ), par une fonction
preg_replace().
Cette fonction preg_replace évaluerait le contenu de la regexp après
migration ( == obtenue au moment du test final if(fin_trouve==1) ), et
qui remplace toutes les occurences de dièze précédés par un nombre x
pair ou nul de "", par x fois "" suivi de "#'. Cela revient à
échapper tous les dièzes qui ne le sont pas, et résoudrait le problème
de l'existence éventuelle de ce signe dièze dans la regexp.
Le seul problème, est que je ne sais pas comment faire un tel
remplacement avec preg_replace().
Au départ, je sélectionnais les caractères de la chaîne param avec la
fonction substr(), mais je me suis aperçu qu'elle ne prenait pas laes
voyelles accentuées ( en ascii, pas en utf-8, je n'ai pas essayé pour
l'utf-8 ).
Je vous demande pardon, j'ai fait un lapsus linguae. ;)
Ce n'était effectivement pas la fonction substr() que j'ai essayé
d'utiliser, mais la fonction sub(). Celle-ci ne prenait pas les voyelles
accentuées. Je ne sais pas quelle fonction prendre pour sélectionner un
par un tous les caractères d'une chaîne ascii éventuellement étendu.
Au fait, il y a ici une supposition implicite, à savoir que la regexp
posix ne contient jamais aucun caractère « / », aussi bien écrit de
façon littérale que caché dans une variable.
J'ai surtout supposé, que tous les caractères "/" étaient échappés dans
la regexp.
Pour résoudre le problème du premier et du dernier caractère de la
regexp modifiée ( == standard pcre ), et pour éviter le cas où il y a
plusieurs caractères "/" "/" accolés, je pense que ce serait correct
d'utiliser le caractère dièze ( # ), et d'encadrer l'ensemble de la
regexp migrée ( sans les # de début et de fin ), par une fonction
preg_replace().
Cette fonction preg_replace évaluerait le contenu de la regexp après
migration ( == obtenue au moment du test final if(fin_trouve==1) ), et
qui remplace toutes les occurences de dièze précédés par un nombre x
pair ou nul de "", par x fois "" suivi de "#'. Cela revient à
échapper tous les dièzes qui ne le sont pas, et résoudrait le problème
de l'existence éventuelle de ce signe dièze dans la regexp.
Le seul problème, est que je ne sais pas comment faire un tel
remplacement avec preg_replace().
Pour résoudre le problème du premier et du dernier caractère de la
regexp modifiée ( == standard pcre ), et pour éviter le cas où il y a
plusieurs caractères "/" "/" accolés, je pense que ce serait correct
d'utiliser le caractère dièze ( # ), et d'encadrer l'ensemble de la
regexp migrée ( sans les # de début et de fin ), par une fonction
preg_replace().
Cette fonction preg_replace évaluerait le contenu de la regexp après
migration ( == obtenue au moment du test final if(fin_trouve==1) ), et
qui remplace toutes les occurences de dièze précédés par un nombre x
pair ou nul de "", par x fois "" suivi de "#'. Cela revient à
échapper tous les dièzes qui ne le sont pas, et résoudrait le problème
de l'existence éventuelle de ce signe dièze dans la regexp.
Le seul problème, est que je ne sais pas comment faire un tel
remplacement avec preg_replace().
Pour résoudre le problème du premier et du dernier caractère de la
regexp modifiée ( == standard pcre ), et pour éviter le cas où il y a
plusieurs caractères "/" "/" accolés, je pense que ce serait correct
d'utiliser le caractère dièze ( # ), et d'encadrer l'ensemble de la
regexp migrée ( sans les # de début et de fin ), par une fonction
preg_replace().
Cette fonction preg_replace évaluerait le contenu de la regexp après
migration ( == obtenue au moment du test final if(fin_trouve==1) ), et
qui remplace toutes les occurences de dièze précédés par un nombre x
pair ou nul de "", par x fois "" suivi de "#'. Cela revient à
échapper tous les dièzes qui ne le sont pas, et résoudrait le problème
de l'existence éventuelle de ce signe dièze dans la regexp.
Le seul problème, est que je ne sais pas comment faire un tel
remplacement avec preg_replace().
Pour résoudre le problème du premier et du dernier caractère de la
regexp modifiée ( == standard pcre ), et pour éviter le cas où il y a
plusieurs caractères "/" "/" accolés, je pense que ce serait correct
d'utiliser le caractère dièze ( # ), et d'encadrer l'ensemble de la
regexp migrée ( sans les # de début et de fin ), par une fonction
preg_replace().
Cette fonction preg_replace évaluerait le contenu de la regexp après
migration ( == obtenue au moment du test final if(fin_trouve==1) ), et
qui remplace toutes les occurences de dièze précédés par un nombre x
pair ou nul de "", par x fois "" suivi de "#'. Cela revient à
échapper tous les dièzes qui ne le sont pas, et résoudrait le problème
de l'existence éventuelle de ce signe dièze dans la regexp.
Le seul problème, est que je ne sais pas comment faire un tel
remplacement avec preg_replace().
Le problème résiduel, consisterait donc à trouver un caractère
délimiteur dont on sache au départ, qu'il n'appartient à aucune des
regexp à migrer ( avec ou sans variables php intégrées ).
Le problème résiduel, consisterait donc à trouver un caractère
délimiteur dont on sache au départ, qu'il n'appartient à aucune des
regexp à migrer ( avec ou sans variables php intégrées ).
Le problème résiduel, consisterait donc à trouver un caractère
délimiteur dont on sache au départ, qu'il n'appartient à aucune des
regexp à migrer ( avec ou sans variables php intégrées ).
Pardon d'enfourcher l'un de mes chevaux de bataille favoris (quoique ça
fasse longtemps que je l'ai laissé tranquille), mais une chaîne ASCII ne
*peut* pas contenir de caractères accentués, et « ASCII étendu » ne veut
rien dire.
Plus précisément, cela peut valoir dire trop de choses différentes.
Parmi les extensions d'ASCII il y a des jeux de caractères 7 bits
dans lesquels certains caractères sont remplacés par d'autres (par
exemple "{|}" par "éùè"), il y a aussi des jeux de caractères 8 bits
parmi lesquels ISO-8859-1, CP1252 ou MacRoman, mais il y a aussi
UTF-8 (qui contrairement au premier que j'ai cité est 100 % compatible
ascendant avec ASCII).
Pardon d'enfourcher l'un de mes chevaux de bataille favoris (quoique ça
fasse longtemps que je l'ai laissé tranquille), mais une chaîne ASCII ne
*peut* pas contenir de caractères accentués, et « ASCII étendu » ne veut
rien dire.
Plus précisément, cela peut valoir dire trop de choses différentes.
Parmi les extensions d'ASCII il y a des jeux de caractères 7 bits
dans lesquels certains caractères sont remplacés par d'autres (par
exemple "{|}" par "éùè"), il y a aussi des jeux de caractères 8 bits
parmi lesquels ISO-8859-1, CP1252 ou MacRoman, mais il y a aussi
UTF-8 (qui contrairement au premier que j'ai cité est 100 % compatible
ascendant avec ASCII).
Pardon d'enfourcher l'un de mes chevaux de bataille favoris (quoique ça
fasse longtemps que je l'ai laissé tranquille), mais une chaîne ASCII ne
*peut* pas contenir de caractères accentués, et « ASCII étendu » ne veut
rien dire.
Plus précisément, cela peut valoir dire trop de choses différentes.
Parmi les extensions d'ASCII il y a des jeux de caractères 7 bits
dans lesquels certains caractères sont remplacés par d'autres (par
exemple "{|}" par "éùè"), il y a aussi des jeux de caractères 8 bits
parmi lesquels ISO-8859-1, CP1252 ou MacRoman, mais il y a aussi
UTF-8 (qui contrairement au premier que j'ai cité est 100 % compatible
ascendant avec ASCII).
Le 14/01/2010 15:17, Jean-Francois Ortolo a écrit :
J'ai surtout supposé, que tous les caractères "/" étaient échappés dans
la regexp.
D'accord, c'est certainement de ma faute car je n'ai pas compris comment
tu traitais vraiment les au sein d'une regexp.
À mon humble avis, tu peux juste limiter les risques en choisissant un
caractère moins courant qu'un caractère ASCII, par exemple ¦ (pas |) ou
bien Ð (pas D).
Cordialement,
Le 14/01/2010 15:17, Jean-Francois Ortolo a écrit :
J'ai surtout supposé, que tous les caractères "/" étaient échappés dans
la regexp.
D'accord, c'est certainement de ma faute car je n'ai pas compris comment
tu traitais vraiment les au sein d'une regexp.
À mon humble avis, tu peux juste limiter les risques en choisissant un
caractère moins courant qu'un caractère ASCII, par exemple ¦ (pas |) ou
bien Ð (pas D).
Cordialement,
Le 14/01/2010 15:17, Jean-Francois Ortolo a écrit :
J'ai surtout supposé, que tous les caractères "/" étaient échappés dans
la regexp.
D'accord, c'est certainement de ma faute car je n'ai pas compris comment
tu traitais vraiment les au sein d'une regexp.
À mon humble avis, tu peux juste limiter les risques en choisissant un
caractère moins courant qu'un caractère ASCII, par exemple ¦ (pas |) ou
bien Ð (pas D).
Cordialement,
Le 14/01/2010 18:28, Olivier Miakinen a écrit :
Bonsoir Monsieur
Dans mon cas c'est très simple.
J'utilise vi comme éditeur, que j'ai configuré pour convertir en mode
latin1 en lecture et écriture, en éditant le fichier de configuration
/etc/vimrc
Le mode latin1 est ce que je désigne par "ascii étendu", c'est
probablement ce que vous appelez iso-8859-1, car du diable si je sais
comment générer le caractère euro avec mon clavier... ;(
Le 14/01/2010 18:28, Olivier Miakinen a écrit :
Bonsoir Monsieur
Dans mon cas c'est très simple.
J'utilise vi comme éditeur, que j'ai configuré pour convertir en mode
latin1 en lecture et écriture, en éditant le fichier de configuration
/etc/vimrc
Le mode latin1 est ce que je désigne par "ascii étendu", c'est
probablement ce que vous appelez iso-8859-1, car du diable si je sais
comment générer le caractère euro avec mon clavier... ;(
Le 14/01/2010 18:28, Olivier Miakinen a écrit :
Bonsoir Monsieur
Dans mon cas c'est très simple.
J'utilise vi comme éditeur, que j'ai configuré pour convertir en mode
latin1 en lecture et écriture, en éditant le fichier de configuration
/etc/vimrc
Le mode latin1 est ce que je désigne par "ascii étendu", c'est
probablement ce que vous appelez iso-8859-1, car du diable si je sais
comment générer le caractère euro avec mon clavier... ;(