J'ai l'honneur ( excusez du peu ;) ) de pr�senter une solution de
migration semi automatique, des fonctions de type regex: split(),
ereg(), eregi(), ereg_replace(), et eregi_replace(), vers leurs
�quivalents de type pcre : preg_split(), preg_match(), et preg_replace().
En effet, ces fonctiosn regex, dispara�tront � la version PHP 6, et
il est donc souhaitable de pouvoir migrer ses sites vers les nouvelles
fonctions.
Compte tenu du fait que cel� int�resse avant tout les programmeurs
php, j'esp�re que le mod�rateur va laisser passer ce message, bien que
ses outils rel�vent plut�t de la programmation Shell et Awk. ;(
Cette solution se compose d'un script en Bourne Shell migration.sh, �
placer dans la racine du site web � migrer, et d'un script awk
filtre.awk � placer aussi dans la racine du site � migrer.
Voici le code des ces deux scripts :
D'abord, migration.sh
La variable dir_init doit �tre aliment�e avec le r�pertoire dans
lequel est install� ce script ( r�pertoire racine du site web ).
Ce script est cens� �tre lanc� � partir du compte root.
La variable perm doit �tre aliment�e avec le propri�taire et groupe
des scripts php � migrer.
Excusez-moi du fait que ces instructions sont sous forme de
citations, j'ai la flemme d'enlever manuellement les d�buts de lignes.
> #!/bin/sh
>
> # Propri�taire et groupe
> # des scripts *.php
> perm="root:root"
>
> # Variables de configuration, c'est le r�pertoire de d�part.
> dir_init="/var/www/html/php"
>
> # Et le script awk de filtre.
> filtre_awk=${dir_init}"/filtre.awk"
>
> # On calcule le r�pertoire absolu courant.
> # Quand le param�tre n'est pas pr�sent,
> # c'est le r�pertoire de d�part, sinon
> # c'est le param�tre du script.
> if [ $# -eq 0 ]; then
> dir=${dir_init}
> else
> dir=$1
> fi
>
> # Positionnement dans le r�pertoire courant.
> cd ${dir}
>
> # On parcourt le r�pertoire courant en s�lectionnant
> # tous les scripts php.
> for i in `ls *.php 2>/dev/null`; do
> if [ -f $i ]; then
> file=${dir}"/"${i}
> file2=${dir}"/super_new_"${i}".txt"
>
> # Traitement du script *.php,
> # l� on se contente d'afficher son nom
> # avec son chemin absolu.
> #
> echo ${file} > /root/tmp2.txt
> echo ${file2} >> /root/tmp2.txt
> echo "" >> /root/tmp2.txt
>
> awk -f ${filtre_awk} -- ${file} 1>${file2} 2>>/root/tmp2.txt
>
> chown $perm ${file2}
> chmod 777 ${file2}
>
> t1=`ls -l ${file} | awk '{ print $5; }'`
> t2=`ls -l ${file2} | awk '{ print $5; }'`
>
> if [ ${t1} -ne ${t2} ]; then
> cat /root/tmp2.txt >> /root/tmp.txt
> fi
> fi
> done
>
> # On lit tous les sous-r�pertoires du r�pertoire courant,
> # et on relance le m�me script, avec ces sous-r�pertoires
> # comme param�tre, pour que ces processus fils
> # se positionnent sur ces sous-r�pertoires.
> #
> for j in `ls -d * 2>/dev/null`; do
> if [ -d $j ]; then
>
> # Calcul du sous-r�pertoire absolu.
> direct=${dir}"/"${j}
>
> ${dir_init}/migration.sh ${direct}
> fi
> done
>
> # A la fin du script, on remonte vers le r�pertoire
> # p�re.
> cd ..
>
> exit 0
Ensuite, voici le code du script filtre.awk :
> function change(param)
> {
> p=split(param, tableau, "");
>
> drapeau=0;
> n=0;
>
> for(i=1; i<=p; i++)
> {
> t=tableau[i];
>
> if(drapeau!=0)
> {
> if(n==0)
> {
> if(t=="\\")
> {
> n++;
> }
> else
> {
> if(t==s)
> {
> chaine=chaine "/" s;
> break;
> }
> else
> chaine=chaine t;
> }
> }
> else
> {
> if(t=="\\")
> n++;
> else
> {
> d="";
> for(k=1; k<=n; k++)
> d=d "\\";
>
> chaine=chaine d;
>
> q=n;
> if(((2*int(q/2.0))==n)&&(t==s))
> {
> chaine=chaine "/" s;
> break;
> }
> else
> chaine=chaine t;
>
> n=0;
> }
> }
>
> }
> else
> {
> if((t=="'")||(t=="\""))
> {
> drapeau=1;
> s=t;
> chaine=t "/";
> }
> # D�but de chr(nombre)
> # ou de variable masque.
> else if((t=="c")||(t=="$"))
> {
> chaine=t;
> break;
> }
> }
> }
>
> i++;
>
> for(; i<=p; i++)
> {
> t=tableau[i];
> chaine=chaine t;
> }
>
> return(chaine);
> }
> function change_i(param)
> {
> p=split(param, tableau, "");
>
> drapeau=0;
> n=0;
>
> for(i=1; i<=p; i++)
> {
> t=tableau[i];
>
> if(drapeau!=0)
> {
> if(n==0)
> {
> if(t=="\\")
> {
> n++;
> }
> else
> {
> if(t==s)
> {
> chaine=chaine "/i" s;
> break;
> }
> else
> chaine=chaine t;
> }
> }
> else
> {
> if(t=="\\")
> n++;
> else
> {
> d="";
> for(k=1; k<=n; k++)
> d=d "\\";
>
> chaine=chaine d;
>
> q=n;
> if(((2*int(q/2.0))==n)&&(t==s))
> {
> chaine=chaine "/i" s;
> break;
> }
> else
> chaine=chaine t;
>
> n=0;
> }
> }
>
> }
> else
> {
> if((t=="'")||(t=="\""))
> {
> drapeau=1;
> s=t;
> chaine=t "/";
> }
> # D�but de chr(nombre)
> # ou de variable masque.
> else if((t=="c")||(t=="$"))
> {
> chaine=t;
> break;
> }
> }
> }
>
> i++;
>
> for(; i<=p; i++)
> {
> t=tableau[i];
> chaine=chaine t;
> }
>
> return(chaine);
> }
> {
> line=$0;
> line2=$0;
>
> if(line ~ /=[ \t]*split[ ]*\(/)
> {
> r=split(line, tableau, /=[ \t]*split[ ]*\(/);
>
> for(l=1; l<=r; l++)
> {
> u=tableau[l];
>
> if(l==1)
> line=u;
> else
> {
> line=line "= preg_split(";
> v=change(u);
> line=line v;
> }
> }
> }
>
> if(line ~ /eregi[ ]*\(/)
> {
> split(line, tableau, /eregi[ ]*\(/);
>
> for(l=1; l<=r; l++)
> {
> u=tableau[l];
>
> if(l==1)
> line=u;
> else
> {
> line=line "preg_match(";
> v=change_i(u);
> line=line v;
> }
> }
> }
>
> if(line ~ /ereg[ ]*\(/)
> {
> split(line, tableau, /ereg[ ]*\(/);
>
> for(l=1; l<=r; l++)
> {
> u=tableau[l];
>
> if(l==1)
> line=u;
> else
> {
> line=line "preg_match(";
> v=change(u);
> line=line v;
> }
> }
> }
>
> if(line ~ /eregi_replace[ ]*\(/)
> {
> split(line, tableau, /eregi_replace[ ]*\(/);
>
> for(l=1; l<=r; l++)
> {
> u=tableau[l];
>
> if(l==1)
> line=u;
> else
> {
> line=line "preg_replace(";
> v=change_i(u);
> line=line v;
> }
> }
> }
>
> if(line ~ /ereg_replace[ ]*\(/)
> {
> split(line, tableau, /ereg_replace[ ]*\(/);
>
> for(l=1; l<=r; l++)
> {
> u=tableau[l];
>
> if(l==1)
> line=u;
> else
> {
> line=line "preg_replace(";
> v=change(u);
> line=line v;
> }
> }
> }
>
> printf ("%s\n", line);
>
> if(line!=line2)
> {
> print "D'abord:" line2 " Ensuite:" line > "/dev/stderr"
> }
> }
A la fin de la migration, vous avez le fichier de logs /root/tmp.txt
qui contient les chemins absolus des scripts php avant et apr�s
migration, ainsi que les lignes des fonctions migr�es.
Ce fichier ne contient que les scripts modifi�s, pas les scripts
inchang�s.
Pour arranger le formattage, je sugg�re de s�parer ce fichier de
logs, en deux fichiers index� de 1 � n, n �tant le nombre de fichiers
modifi�s.
Pour cel� :
cat tmp.txt | awk 'BEGIN{ i=0; j=0; }{ if(length($0)<5) { i++; j++;
if(j==1) print i; } else if ($0 !~ /Ensuite/) { j=0; print $0; } }' >
fichiers.txt
cat tmp.txt | awk 'BEGIN{ i=0; j=0; }{ if(length($0)<5) { i++; j++;
if(j==1) print i; } else if ($0 ~ /Ensuite/) { j=0; print $0; } }' | awk
'{ for(i=2; i<=NF; i++) if($i != "Ensuite:") printf("%s ", $i); else
printf(" "); printf("\n"); }' > fonctions.txt
Ensuite, vous aurez dans fichiers.txt la liste index�s de 1 � n des
chemins absolus des fichiers sources et cibles par paires, et dans
fonctions.txt la liste index�e des fonctions avant et apr�s migration,
par groupes de fonctions pour chaque fichiers modifi�s.
Dans les deux cas, l'index va de 1 � n, et n a la m�me valeur dans
les deux cas.
Il faut obligatoirement v�rifier dans le fichier fonctions.txt qu'il
n'y a pas d'erreur lors de la migration des fonctions.
Th�oriquement la seule erreur peut r�sulter du fait que l'expression
rationnelle est contenue dans une variable php ( commen�ant par $ le
caract�re dollar ). Dans ce cas �videmment, il n'y a pas d'autre
solution que d'�diter manuellement le fichier cible correspondant ( de
m�me index dans le fichiers fichiers.txt ), pour modifier cette variable
php qui sert d'expression rationnelle.
Comme conclusion, je serais int�ress� � ce que vous m'indiquiez les
erreurs de programmation �ventuelles que vous voyez, car je suis en
train de faire cette migration sur mon ordinateur, pour mon site
www.pronostics-courses.fr versions locale et remote, ainsi que pour le
site www.lescourses.com, mon site partenaire, que j'ai copi� sur mon
ordinateur. ;) Cel� me permettrait de diminuer le risque d'erreurs.
Je suis aussi int�ress� par vos remarques et suggestions, compte tenu
du fait que cette topique de migration automatis�e de fonctions regex
vers des fonctions pcre, avait �t� abord�e il y de cel� quelques
semaines ou mois.
Bien � vous.
Amicalement.
Jean-Fran�ois Ortolo
--
Visitez le site http://www.pronostics-courses.fr/
donnant des Statistiques, Pronostics et Historiques graphiques
tr�s �labor�s.
Les Statistiques sont calcul�es d'apr�s une base de donn�es
allant du 1er Janvier 2000 jusqu'� tr�s r�cemment.
Le 07/01/2010 18:36, Jean-Francois Ortolo a ᅵcrit :
>
> J'ai l'honneur ( excusez du peu ;) ) de prᅵsenter une solution de
> migration semi automatique, des fonctions de type regex: split(),
> ereg(), eregi(), ereg_replace(), et eregi_replace(), vers leurs
> ᅵquivalents de type pcre : preg_split(), preg_match(), et preg_replace().
Excellent ! Je n'aurais moi-mᅵme pas eu le courage de me lancer dans
une telle entreprise. Merci aussi de venir nous en faire profiter.
> [...]
>
> Compte tenu du fait que cela intᅵresse avant tout les programmeurs
> php, j'espᅵre que le modᅵrateur va laisser passer ce message, bien que
> ses outils relᅵvent plutᅵt de la programmation Shell et Awk. ;(
Je suis d'accord avec ᅵa. Nᅵanmoins, je me permets de copier ma rᅵponse
dans fr.comp.lang.regexp car cela pourrait en intᅵresser d'autres. Le
suivi est positionnᅵ sur fr.comp.lang.php malgrᅵ tout.
> [...]
>
> Comme conclusion, je serais intᅵressᅵ ᅵ ce que vous m'indiquiez les
> erreurs de programmation ᅵventuelles que vous voyez, [...]
Je suis volontaire pour regarder. Pour optimiser cette relecture, est-ce
que tu pourrais commencer par epliciter un peu les limites que tu t'es
fixᅵes ?
Par exemple :
- comment reconnais-tu un fichier PHP (extension du fichier ou prᅵsence
de <?php ... ?>) ?
- supportes-tu la syntaxe <?= ... ?> ?
- la fonction ᅵ traduire peut-elle s'ᅵtendre sur plusieurs lignes ?
- quels dᅵlimiteurs reconnais-tu pour les chaᅵnes (guillemets simples,
guillemets doubles, HEREDOC, NOWDOC) ?
- une regexp peut-elle ᅵtre scindᅵe en plusieurs chaᅵnes concatᅵnᅵes
avec l'opᅵrateur ᅵ . ᅵ ?
- si oui, peut-on avoir un mᅵlange de dᅵlimiteurs ('abc' . "def") ?
- en gros, quelles sont les transformations faites ᅵ la regexp ?
Cordialement,
--
Olivier Miakinen
Je vous prie de bien vouloir m'excuser, ma solution ne fonctionne que
si les scripts php sont cod�s en mode iso-8859-1 ou iso-8859-15, �
l'exclusion du mode utf8. Donc, en mode ascii �tendu ( caract�res de 0 �
255 ).
J'accepte avec plaisir et reconnaissance toutes les remarques et
critiques.
Bonjour Monsieur
Une remarque de mise au point pour mes scripts.
D'abord, pour le script migration.sh, il faut que l'instruction echo
"" > /root/tmp2.txt soit situᅵe avant et non pas aprᅵs les deux lignes
echo ${file} >> /root/tmp2.txt et echo ${file2} >> /root/tmp2.txt ( >>
dans les deux cas, et non pas > ).
Celᅵ permet de n'avoir qu'un seule ligne vide avant chaque groupes de
noms de fichiers suivis par les fonctions contenues dans ces fichiers.
Et puis, j'apporte un changement au traitement pour arranger le
fichier de logs :
Pour les fonctions, indexᅵes par groupes pour chaque fichiers traitᅵs :
awk 'BEGIN { i=0; j=0; }{ if(length($0)<6) { i++; j++; if(j==1) print
i; } else if($0 ~ /Ensuite/) { j=0; q=split($0, tableau, ""); line="";
for(i=9; i<=q; i++) line=line tableau[i]; printf("%s\n", line); } }'
/root/tmp.txt | awk '{ split($0, tableau, "Ensuite:"); line=tableau[1] "
" tableau[2]; printf("%s\n", line); }' > fonctions.txt
Pour les fichiers, indexᅵs par fichiers traitᅵs :
awk 'BEGIN { i=0; j=0; }{ if(length($0)<6) { i++; j++; if(j==1) print
i; } else if($0 !~ /Ensuite/) { j=0; print $0; } }' /root/tmp.txt >
fichiers.txt
Pour finir, j'ai commis une erreur ( un lapsus ), en oubliant
d'affecter la variable r ᅵ partir de tous les split ᅵ la fin du script
filtre.awk
Par exemple, pour la fonction ereg() :
r=split($0, tableau2, /ereg[ ]*\(/);
au lieu de :
split($0, tableau, /ereg[ ]*\(/);
En effet, il faut bien avoir le nombre des ᅵlᅵment de l'array
tableau2. L'erreur faisait que la valeur prᅵcᅵdente de r ᅵtait prise, ce
qui occasionnait des erreurs.
Il vaut mieux je crois, mettre tableau2 systᅵmatiquement au lieu de
tableau pour le corps principal du script, car les fonctions utilisent
tableau, et je ne sais pas trᅵs bien comment fonctionnent les variables
locales aux fonctions, si elles sont rᅵellement indᅵpendantes des
variables externes aux fonctions. La honte... ;(
Voilᅵ donc toutes ces erreurs corrigᅵes.
Pour rᅵpondre ᅵ votre question, je reconnais un script php uniquement
ᅵ son extension *.php
Si la nᅵcessitᅵ se fait jour d'identifier les scripts php d'une autre
maniᅵre, normalement ce sera le rᅵle du script migration.sh de le faire,
probablement d'aprᅵs le contenu de ces fichiers, qui peut ᅵtre lu est
interprᅵtᅵ avec un cat.
Le problᅵme pourrait ᅵventuellement se poser pour des scripts php
sasn extension *.php , destinᅵs exclusivement ᅵ ᅵtre inclus dans
d'autres scripts php. J'aurai ᅵ faire cette vᅵrification pour mon site
partenaire que j'ai copiᅵ sur mon ordinateur.
A part ᅵᅵ, effectivement le script filtre.awk suppose que l'expression
rationnelle source Posix, est une chaᅵne entourᅵe de doubles quotes ou
de simples quotes, ou bien un caractᅵre du type chr(nombre), ou bien une
variable php commenᅵant par le signe dollar $
Pour traiter le cas oᅵ il pourrait y avoir plusieurs chaᅵnes de
caractᅵres accolᅵes, ou bien des chaᅵnes associᅵes avec des variables ou
autre, il faudrait complexifier la reconnaissance de la fin de
l'expression rationnelle.
J'assume, que pour transformer une expression rationnelle Posix
simple en expression rationnelle pcre, il suffit de rajouter / avant le
dᅵbut aprᅵs la premiᅵre quote double ou simple, et / ou /i aprᅵs la fin,
avant la derniᅵre quote double ou simple.
Cᅵ marche avec des expressions rationnelles Posix simples, sauf
qu'ᅵvidemment quand l'expression rationnelle est sous forme de variable
php, il faut intervenir manuellement sur cette variable dans le fichier
cible, pour qu'elle devienne conforme ᅵ la norme pcre.
Dans le cas oᅵ l'expression rationnelle est dans une variable php (
dᅵtectᅵe par le signe dollar en dᅵbut d'expression ) ou est de la forme
chr(nombre), celle-ci n'est pas modiifᅵe, mais la fonction est modifiᅵe,
donc le fichier cible voit son nombre de caractᅵres, augmenter.
Il n'y a donc pas de cas oᅵ un fichier source soit inchangᅵ, bien
qu'il contienne quand mᅵme au moins une fonction ᅵ migrer. Le processus
est donc suffisamment sᅵcurisᅵ, pour peu que tous les scripts php
sources soient dᅵtectᅵs.
Il faut donc, faire une vᅵrification patiente de toutes les fonctions
migrᅵes, ce pourquoi j'arrange le fichier de logs, vers les fichiers
fichiers.txt et fonctions.txt
fonctions.txt contient pour chaque numᅵro d'index ( correspondant ᅵ
un fichier source et cible dans fichiers.txt ) un groupe de lignes oᅵ
figurent ᅵ gauche la ligne du fichier avant migration, et ᅵ droite la
ligne du fichier aprᅵs migration.
Il est ainsi possible, de fractionner cette vᅵrification, en
supprimant progressivement de fonctions.txt toutes les lignes
correctement migrᅵes, pour ne laisser que celle qui nᅵcessitent un
traitement manuel.
Pour infos, j'ai migrᅵ sur mon ordinateur mon site web
www.pronostics-courses.fr versions locale et remote, ainsi que mon site
partenaire www.lescourses.com prᅵalablement copiᅵ.
Globalement, j'ai mesurᅵ que j'ai 352 fichiers migrᅵs, et 17418
lignes migrᅵes.
Celᅵ signifie, que pour la vᅵrification, j'aurai ᅵ me taper la
lecture de 17418 lignes, en regardant soigneusement les expressions
rationnelles, pour vᅵrifier qu'il n'y a pas d'erreur.
Et encore, dans tous les cas oᅵ ces expressions rationnelles sont
contenues dans des variables php, il me faudra ᅵditer le fichier cible
manuellement, pour modifier ces variables, en faisant attention que celᅵ
n'entraᅵne pas d'effet de bord sur le reste des programmes.
Je pense honnᅵtement, qu'une migration entiᅵrement automatique n'est
pas envisageable, et que ma solution n'est valable que dans le contexte
oᅵ les expressions rationnelles Posix sont simples. Enfin, il est
nᅵcᅵssaire que je ne passe pas ᅵ cᅵtᅵ de fonctions ᅵ migrer qui ne
soient pas modifiᅵes, ᅵ cause d'erreurs imprᅵvisibles et inapercues.
Je reconnais les limitations de mon approche.
Merci beaucoup de vos rᅵponses.
Bien ᅵ vous.
Amicalement.
Jean-Franᅵois Ortolo
--
Visitez le site http://www.pronostics-courses.fr/
donnant des Statistiques, Pronostics et Historiques graphiques
trᅵs ᅵlaborᅵs.
Les Statistiques sont calculᅵes d'aprᅵs une base de donnᅵes
allant du 1er Janvier 2000 jusqu'ᅵ trᅵs rᅵcemment.
Bonjour,
Ben crotte, c'est un sacr� boulot mais tout est en utf-8 pour moi.
Bon, d'un autre c�t�, je ne dois plus avoir beaucoup d'ereg...
Bonjour Monsieur
En fait... Le probl�me concernerait la reconnaissance de caract�res
utf-8, donc sur deux octets, ce qui d�pendrait avant tout des facult�s
qu'aurait awk lui-m�me, et le Shell bash ( ou sh ) �ventuellement, �
reconna�tre les caract�res utf-8.
Il me semble cependant, qu'en utf-8, les caract�res ascii purs sont
conserv�s par rapport � de l'iso-8859-1, quant aux caract�res �tendus (
128-255 en iso ), je ne suis pas comp�tent pour savoir comment �a se
traduit en utf-8.
Donc, dans l'ensemble, je ne sais pas quelles sont les conditions
pour que awk sache lire et �crire de l'utf-8, le probl�me de la
reconnaissance de patterns ( expressions rationnelles ) �tant �cart�
puisque tous les patterns utilis�s dans mes deux scripts migration.sh et
filtre.awk, sont de l'ascii non �tendu.
Il se peut tr�s bien, que ma solution convienne aussi pour de
l'utf-8, mais je ne suis pas comp�tent pour le dire, car je suis
compl�tement nul en utf-8. ;)
Merci beaucoup de votre r�ponse.
Je n'ai pas encore lu ton code, mais ᅵ priori je ne pense pas que ce
soit nᅵcessaire : il suffit qu'aucun octet avec le 8e bit ᅵ 1 ne soit
traitᅵ de maniᅵre spᅵciale, et en principe c'est le cas (les seuls
caractᅵres spᅵciaux sont de l'ASCII 7 bits).
> Il me semble cependant, qu'en utf-8, les caractᅵres ascii purs sont
> conservᅵs par rapport ᅵ de l'iso-8859-1, quant aux caractᅵres ᅵtendus (
> 128-255 en iso ), je ne suis pas compᅵtent pour savoir comment ᅵa se
> traduit en utf-8.
En UTF-8, tout caractᅵre non ASCII est codᅵ en plusieurs octets dont
aucun n'est un caractᅵre ASCII : pas de risque de confusion, donc.
> [...]
>
> Il se peut trᅵs bien, que ma solution convienne aussi pour de
> l'utf-8, mais je ne suis pas compᅵtent pour le dire, car je suis
> complᅵtement nul en utf-8. ;)
Moi je le pense. Comme je l'ai rᅵpondu aussi ᅵ Olivier Masson, si l'ereg
ᅵtait correcte en UTF-8, elle doit le rester en devenant une
preg. ᅵ l'occasion je lancerai un nouveau fil sur ce sujet.
Oui !
> mais tout est en utf-8 pour moi.
> Bon, d'un autre cᅵtᅵ, je ne dois plus avoir beaucoup d'ereg...
... l'un allant d'ailleurs de pair avec l'autre !
Sauf erreur, il n'y a aucun moyen pour demander ᅵ ereg de traiter des
jeux de caractᅵres sur plusieurs octets. Par consᅵquent, si on utilise
des ereg en UTF-8, soit c'est buguᅵ et ce sera buguᅵ pareil en preg,
soit ᅵa marche et ᅵa marchera pareil en UTF-8.
Bonsoir Monsieur
Dans mon cas, j'ai reconnu des scripts pouvant approximativement ᅵtre
des scripts php, ( mais qui ne l'ᅵtaient probablement pas, je n'ai pas
vᅵrifiᅵ ), en cherchant avec cat ${file} | egrep -e "include[ \t]*\("
dans le script migration.sh tous les fichiers inclus dans les fihciers
de suffixe *.php ( mᅵme chose avec include_once, require et require_once ).
J'ai obtenu un certain nombre de fichiers de suffixe *.inc, que j'ai
identifiᅵs et passᅵ ᅵ la moulinette cat *.inc | grep split ( ou ereg ou
replace ) sans aucun rᅵsultat trouvᅵ.
Donc, dans mon cas seul, le procᅵdᅵ utilisᅵ pour trouver les scripts
php fonctionne, car le suffixe *.php est toujours utilisᅵ pour les
scripts php. Merci la normalisation... ;(
Je vais sous peu commencer ma vᅵrification lente et laborieuse de
toutes les fonctions migrᅵes, il y en 17418 pour 352 fichiers modifiᅵs,
ouf...
J'en aurai pour un bout de temps, quoi... ;(
Aprᅵs, ce sera le tour de la correction prᅵcise des cas en erreur (
expressions rationnelles dans des variables pratiquement ).
Bien ᅵ vous.
Amicalement.
Jean-Franᅵois Ortolo
--
Visitez le site http://www.pronostics-courses.fr/
donnant des Statistiques, Pronostics et Historiques graphiques
Bonjour
Aprᅵs arrangement du fichiers fonctions.txt, et sᅵparation entre les
fonctions avec et sans variables expressions rationnelles, j'obtiens ce
rᅵsultat :
Il y a 1638 lignes modifiᅵes ( = ᅵ corriger ) comportant des
variables, pour un ensemble de 345 fichiers ᅵ corriger manuellement.
Et 15467 lignes sans variables, donc ne comportant d'erreur,
pratiquement, que si un caractᅵre hors norme est situᅵ dans l'expression
rationnelle.
Ouf... Seulement 345 fichiers ᅵ corriger, ouf, ouf.
Je vais voir comment sᅵlectionner automatiquement ces fichiers par
leur numᅵros d'index.
Aprᅵs, j'ᅵditerai chacun de ces fichiers cibles, 345 fichiers
pfffooouuu... ;(
Celᅵ montre, que mᅵme pour plusieurs sites sans prᅵparation, on peut
migrer les sites, de maniᅵre beaucoup plus rapide avec ma mᅵthode
qu'avec la mᅵthode manuelle.
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";
# On sort de la boucle.
break;
}
else if(t==".")
{
# L'expression rationnelle
# continue avec une autre
# expression accol�e.
chaine=chaine t;
}
else
{
# Fin de l'expression rationnelle
# rencontr�e.
fin_trouve=1;
# t n'a pas �t� affect�,
# elle le sera en sortie de boucle.
#
#
# On sort de la boucle.
break;
}
}
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, "");
for(x=1; ((i<=p)&&(x<=w)); x++)
{
if(t==tab[x])
{
chaine=chaine tab[x];
i++;
t=tableau[i];
}
else
{
# Erreur, token non pr�vu.
break;
}
}
if(x<=w)
{
# Le token n'est pas
# conforme.
print "Erreur: token non pr�vu: " param " " chaine > "/dev/stderr";
#" On sort de la boucle.
break;
}
else
{
# Recherche de la parenth�se
# ouvrante,
# puis suite du traitement.
while((i<=p)&&(t!="("))
{
i++;
t=tableau[i];
}
chaine=chaine "(";
i++;
t=tableau[i];
if(pattern=="chr")
{
# Dans ce cas, on cherche
# la parenth�se fermante,
# suivie le cas �ch�ant
# d'un point ( . )
# ou la virgule de fin
# d'expression rationnelle.
while((i<=p)&&(t!=")"))
{
chain=chaine t;
i++;
t=tableau[i];
}
# On cherche un point
# Ou la virgule de fin.
i++;
t=tableau[i];
while((i<=p)&&(t!=".")&&(t!=","))
{
# On prend le point,
# mais pas la virgule.
if(t!=",")
chaine=chaine t;
i++;
t=tableau[i];
}
# La fin de l'expression rationnelle
# a �t� trouv�e, on sort.
if(t==",")
{
fin_trouve=1;
break;
}
}
}
}
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)))
{
indic=1;
# On n'�chappe pas
# le signe +
# s'il est pr�c�d�
# de ]
# ( expression rationnelle ).
if(t=="+")
{
if(tableau[i-1]!="]")
chaine=chaine "\\";
else
indic=0;
}
else if(t=="&")
chaine=chaine "\\";
else if(t==s)
chaine=chaine "\\";
}
chaine=chaine t;
n=0;
# quote sans �chappement :
# La fin de l'expression
# rationnelle en cours
# a �t� trouv�e.
if((indic==0)&&(t==s))
quote_trouve=1;
}
i++;
t=tableau[i];
}
# On a trouv� la quote terminale
# de l'expression rationnelle en cours,
# donc on cherche le point,
# ou la virgule qui marque la fin
# de l'expression rationnelle globale.
while((i<=p)&&(t!=".")&&(t!=","))
{
# On prend le point,
# mais pas la virgule.
if(t!=",")
chaine=chaine t;
i++;
t=tableau[i];
}
# La fin de l'expression rationnelle
# a �t� trouv�e, on sort.
if(t==",")
{
fin_trouve=1;
break;
}
}
}
if(fin_trouve==1)
{
# tableau[i]==","
# On compl�te la cha�ne,
# de mani�re � l'adapter
# � la norme pcre.
chaine=chaine ".\"/\",";
# Et puis, on compl�te
# le reste de la fonction.
i++;
while(i<=p)
{
t=tableau[i];
chaine=chaine t;
i++;
}
}
return(chaine);
}
function change_i(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";
# On sort de la boucle.
break;
}
else if(t==".")
{
# L'expression rationnelle
# continue avec une autre
# expression accol�e.
chaine=chaine t;
}
else
{
# Fin de l'expression rationnelle
# rencontr�e.
fin_trouve=1;
# t n'a pas �t� affect�,
# elle le sera en sortie de boucle.
#
#
# On sort de la boucle.
break;
}
}
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, "");
for(x=1; ((i<=p)&&(x<=w)); x++)
{
if(t==tab[x])
{
chaine=chaine tab[x];
i++;
t=tableau[i];
}
else
{
# Erreur, token non pr�vu.
break;
}
}
if(x<=w)
{
# Le token n'est pas
# conforme.
print "Erreur: token non pr�vu: " param " " chaine > "/dev/stderr";
#" On sort de la boucle.
break;
}
else
{
# Recherche de la parenth�se
# ouvrante,
# puis suite du traitement.
while((i<=p)&&(t!="("))
{
i++;
t=tableau[i];
}
chaine=chaine "(";
i++;
t=tableau[i];
if(pattern=="chr")
{
# Dans ce cas, on cherche
# la parenth�se fermante,
# suivie le cas �ch�ant
# d'un point ( . )
# ou la virgule de fin
# d'expression rationnelle.
while((i<=p)&&(t!=")"))
{
chain=chaine t;
i++;
t=tableau[i];
}
# On cherche un point
# Ou la virgule de fin.
i++;
# L'un ou l'autre
# a �t� trouv�, donc
# on actualise chaine.
t=tableau[i];
while((i<=p)&&(t!=".")&&(t!=","))
{
# On prend le point,
# mais pas la virgule.
if(t!=",")
chaine=chaine t;
i++;
t=tableau[i];
}
# La fin de l'expression rationnelle
# a �t� trouv�e, on sort.
if(t==",")
{
fin_trouve=1;
break;
}
}
}
}
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)))
{
indic=1;
# On n'�chappe pas
# le signe +
# s'il est pr�c�d�
# de ]
# ( expression rationnelle ).
if(t=="+")
{
if(tableau[i-1]!="]")
chaine=chaine "\\";
else
indic=0;
}
else if(t=="&")
chaine=chaine "\\";
else if(t==s)
chaine=chaine "\\";
}
chaine=chaine t;
n=0;
# quote sans �chappement :
# La fin de l'expression
# rationnelle en cours
# a �t� trouv�e.
if((indic==0)&&(t==s))
quote_trouve=1;
}
i++;
t=tableau[i];
}
# On a trouv� la quote terminale
# de l'expression rationnelle en cours,
# donc on cherche le point,
# ou la virgule qui marque la fin
# de l'expression rationnelle globale.
while((i<=p)&&(t!=".")&&(t!=","))
{
# On prend le point,
# mais pas la virgule.
if(t!=",")
chaine=chaine t;
i++;
t=tableau[i];
}
# La fin de l'expression rationnelle
# a �t� trouv�e, on sort.
if(t==",")
{
fin_trouve=1;
break;
}
}
}
if(fin_trouve==1)
{
# tableau[i]==","
# On compl�te la cha�ne,
# de mani�re � l'adapter
# � la norme pcre.
chaine=chaine ".\"/i\",";
# Et puis, on compl�te
# le reste de la fonction.
i++;
while(i<=p)
{
t=tableau[i];
chaine=chaine t;
i++;
}
}
return(chaine);
}
{
line=$0;
line2=$0;
if(line ~ /=[ \t]*split[ ]*\(/)
{
r=split(line, tableau2, /=[ \t]*split[ ]*\(/);
for(l=1; l<=r; l++)
{
u=tableau2[l];
if(l==1)
line=u;
else
{
line=line "= preg_split(";
v=change(u);
line=line v;
}
}
}
if(line ~ /eregi[ ]*\(/)
{
r=split(line, tableau2, /eregi[ ]*\(/);
for(l=1; l<=r; l++)
{
u=tableau2[l];
if(l==1)
line=u;
else
{
line=line "preg_match(";
v=change_i(u);
line=line v;
}
}
}
if(line ~ /ereg[ ]*\(/)
{
r=split(line, tableau2, /ereg[ ]*\(/);
for(l=1; l<=r; l++)
{
u=tableau2[l];
if(l==1)
line=u;
else
{
line=line "preg_match(";
v=change(u);
line=line v;
}
}
}
if(line ~ /eregi_replace[ ]*\(/)
{
r=split(line, tableau2, /eregi_replace[ ]*\(/);
for(l=1; l<=r; l++)
{
u=tableau2[l];
if(l==1)
line=u;
else
{
line=line "preg_replace(";
v=change_i(u);
line=line v;
}
}
}
if(line ~ /ereg_replace[ ]*\(/)
{
r=split(line, tableau2, /ereg_replace[ ]*\(/);
for(l=1; l<=r; l++)
{
u=tableau2[l];
if(l==1)
line=u;
else
{
line=line "preg_replace(";
v=change(u);
line=line v;
}
}
}
printf ("%s\n", line);
# if(line!=line2)
# {
# print "D'abord: " line2 " Ensuite: " line > "/dev/stderr"
# }
}
----------------------------------------------------------------------
Ouf, ensuite le script en Bourne Shell qui s'occupe de la r�cursivit� :
dir_init doit �tre aliment� avec le r�pertoire racine, dans lequel
sont install�s filtre.awk et migration.sh
Ce script est destin� � �tre lanc� en tant que root.
--------------------------------------------------------------------
#!/bin/sh
echo "" > /root/tmp2.txt
echo ${file} >> /root/tmp2.txt
echo ${file2} >> /root/tmp2.txt
awk -f ${filtre_awk} -- ${file} 1>${file2} 2>>/root/tmp2.txt
chown $perm ${file2}
chmod 777 ${file2}
t1=`ls -l ${file} | awk '{ print $5; }'`
t2=`ls -l ${file2} | awk '{ print $5; }'`
if [ ${t1} -ne ${t2} ]; then
cat /root/tmp2.txt >> /root/tmp.txt
fi
fi
done
# On lit tous les sous-r�pertoires du r�pertoire courant,
# et on relance le m�me script, avec ces sous-r�pertoires
# comme param�tre, pour que ces processus fils
# se positionnent sur ces sous-r�pertoires.
#
# Dans un premier temps, on teste le traitement
# effectu� uniquement sur les script *.php
# du r�pertoire de d�part, donc
# il y a annulation du caract�re r�cursif.
#
for j in `ls -d * 2>/dev/null`; do
if [ -d $j ]; then
# Calcul du sous-r�pertoire absolu.
direct=${dir}"/"${j}
/var/www/html/php/migration.sh ${direct}
fi
done
# A la fin du script, on remonte vers le r�pertoire
# p�re.
cd ..
exit 0
-------------------------------------------------------------
Voil�, je vous prie de bien vouloir m'excuser de la dimension du code.
Je suis � votre enti�re disposition pour r�pondre aux questions.
Le script filtre.awk, assume que l'expression rationnelle Posix �
migrer, sera sur la m�me ligne que le nom de la fonction, et sera sur
une seule ligne, autrement il y aurait une erreur, il serait impossible
de d�tecter la suite de l'expression rationnelle... Mais qui aurait
l'id�e de mettre une expression rationnelle sur plusieurs lignes ?
Je ne sais pas trop si c'est valable pour de l'utf-8 aussi, je vous
laisse le soin d'en juger.
Pour v�rifier ce code, il faudrait chercher s'il y a des cas, o� il y
a des erreurs qui ne donnent lieu � aucun message d'erreur.
Enfin, filtre.awk assume qu'une variable expression rationnelle, ne
peut �tre accol�e avec une expression rationnelle partielle adjacente,
qu'avec un point ( . ) pour la concat�nation. Dans le cas contraire, le
code serait plus compliqu�. ;)
Th�oriquement, ces scripts assurent la migration avec d�tection
d'erreurs, sans qu'il y ait besoin d'autres v�rifications que de faire,
apr�s :
cat /root/tmp.txt | grep Erreur
S'il y a des lignes qui apparaissent, �videmment... ;(
Merci beaucoup de vos r�ponses.
Voici la toute derni�re version, permettant de prendre en compte
correctement le cas o� la fonction trim() ( aussi bien que chr() )
figure dans l'expression rationnelle regex de d�part � migrer vers une
expression rationnelle pcre.
Donc au final, les deux seules fonctions admises dans ces expressions
rationnelles, sont chr() et trim(). S'il s'av�rait qu'il puisse y avoir
d'autres fonctions de traitement de cha�nes de caract�res �ventuellement
rencontr�es dans la r�alit�, merci de me le dire, cependant, il
suffirait dans ce cas d'une modification mineure, pour �largir le "else"
indiquant la pr�sence du pattern trim, � d'autres patterns de noms de
fonctions, le traitement quant � lui restant identique.
Merci beaucoup de vos suggestions � ce sujet.
Le code de migration.sh est le m�me que pr�c�demment, donc je ne
donne que le code de filtre.awk sous sa forme d�finitive :
--------------------------------------------------------------
p=split(param, tableau, "");
i++;
t=tableau[i];
}
w=split(pattern, tab, "");
chaine=chaine "(";
i++;
t=tableau[i];
}
chaine=chaine ")";
# On cherche un point
# Ou la virgule de fin.
i++;
t=tableau[i];
while((i<=p)&&(t!=".")&&(t!=","))
{
# On prend le point,
# mais pas la virgule.
if(t!=",")
chaine=chaine t;
i++;
t=tableau[i];
}
# La fin de l'expression rationnelle
# a �t� trouv�e, on sort.
if(t==",")
{
fin_trouve=1;
break;
}
else
# C'est le point.
chaine=chaine t;
}
else
{
# Cas de la fonction trim().
z=1;
# On recherche la premi�re parenth�se
# fermante, matchant
# la parenth�se ouvrante
# d�j� rencontr�e.
while((i<=p)&&(z>0))
{
if(t=="\\")
{
n++;
}
else
{
for(x=1; x<=n; x++)
chaine=chaine "\\";
q=n;
chaine=chaine t;
if((q==0)||((2*int(q/2.0))==n))
{
if(t==")")
{
z--;
if(z==0)
{
# Parenth�se fermante matchant
# trouv�e, on sort de la boucle.
break;
}
}
else if(t=="(")
{
z++;
}
}
n=0;
}
i++;
t=tableau[i];
}
n=0;
if(i>p)
{
# Le token n'est pas
# conforme.
print "Erreur: token non pr�vu: " param " " chaine >
"/dev/stderr";
# On sort de la boucle.
break;
}
else
{
# On cherche un point
# Ou la virgule de fin.
i++;
t=tableau[i];
while((i<=p)&&(t!=".")&&(t!=","))
{
# On prend le point,
# mais pas la virgule.
if(t!=",")
chaine=chaine t;
i++;
t=tableau[i];
}
# La fin de l'expression rationnelle
# a �t� trouv�e, on sort.
if(t==",")
{
fin_trouve=1;
break;
}
else
# C'est le point.
chaine=chaine t;
q=n;
chaine=chaine t;
n=0;
i++;
t=tableau[i];
}
break;
}
else
# C'est le point.
chaine=chaine t;
}
}
while(i<=p)
{
t=tableau[i];
chaine=chaine t;
i++;
}
}
p=split(param, tableau, "");
i++;
t=tableau[i];
}
w=split(pattern, tab, "");
chaine=chaine "(";
chaine=chaine t;
i++;
t=tableau[i];
}
chaine=chaine ")";
# On cherche un point
# Ou la virgule de fin.
i++;
# L'un ou l'autre
# a �t� trouv�, donc
# on actualise chaine.
t=tableau[i];
while((i<=p)&&(t!=".")&&(t!=","))
{
# On prend le point,
# mais pas la virgule.
if(t!=",")
chaine=chaine t;
i++;
t=tableau[i];
}
# La fin de l'expression rationnelle
# a �t� trouv�e, on sort.
if(t==",")
{
fin_trouve=1;
break;
}
else
# C'est le point.
chaine=chaine t;
}
else
{
# Cas de la fonction trim().
z=1;
# On recherche la premi�re parenth�se
# fermante, matchant
# la parenth�se ouvrante
# d�j� rencontr�e.
while((i<=p)&&(z>0))
{
if(t=="\\")
{
n++;
}
else
{
for(x=1; x<=n; x++)
chaine=chaine "\\";
q=n;
chaine=chaine t;
if((q==0)||((2*int(q/2.0))==n))
{
if(t==")")
{
z--;
if(z==0)
{
# Parenth�se fermante matchant
# trouv�e, on sort de la boucle.
break;
}
}
else if(t=="(")
{
z++;
}
}
n=0;
}
i++;
t=tableau[i];
}
n=0;
if(i>p)
{
# Le token n'est pas
# conforme.
print "Erreur: token non pr�vu: " param " " chaine >
"/dev/stderr";
# On sort de la boucle.
break;
}
else
{
# On cherche un point
# Ou la virgule de fin.
i++;
t=tableau[i];
while((i<=p)&&(t!=".")&&(t!=","))
{
# On prend le point,
# mais pas la virgule.
if(t!=",")
chaine=chaine t;
i++;
t=tableau[i];
}
# La fin de l'expression rationnelle
# a �t� trouv�e, on sort.
if(t==",")
{
fin_trouve=1;
break;
}
else
# C'est le point.
chaine=chaine t;
q=n;
chaine=chaine t;
n=0;
i++;
t=tableau[i];
}
break;
}
else
# C'est le point.
chaine=chaine t;
}
}
while(i<=p)
{
t=tableau[i];
chaine=chaine t;
i++;
}
}
return(chaine);
}
{
line=$0;
line2=$0;
-----------------------------------------------------------------
Ouf, ouf...
L� encore, je vous prie de bien vouloir m'excuser de la longueur du
code, qui pourrait d'ailleur �tre raccourci en ne mettant qu'une seule
fonction change() avec un deuxi�me param�tre indiquant s'il faut ou non
ajouter i apr�s le slash ( / ) terminant l'expression rationnelle migr�e.
Sous cette forme, et compte tenu des limitations indiqu�es en haut du
message, qui peuvent �tre surmont�es de la mani�re indiqu�e, je pense
que l'on peut consid�rer que c'est la version d�finitive, b�ta.
Ces deux scripts filtre.awk et migration.sh , peuvent ainsi servir
pour tr�s rapidement migrer ces fonctions regex obsol�tes sous php 6,
vers les fonctions pcre, de fa�on � permettre � vos sites, de supporter
un h�bergement php 6.
Il va de soi, que pour qu'un site soit compatible php 6, il y a aussi
d'autres conditions, mais je me contente d'apporter ma pierre � l'�difice...
Merci beaucoup de vos r�ponses, critiques et suggestions.
Je n'ai pas trouvᅵ le temps de tout lire, mais il faut que je publie mes
quelques remarques dᅵs maintenant sinon je ne le ferai jamais.
Le 10/01/2010 18:10, Jean-Francois Ortolo a ᅵcrit :
>
> 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
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.
> -----------------------------------------------------------
>
> 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, "");
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.
> # n = nombre de caractᅵres backslashes
> # ( \ ) rencontrᅵs.
> n=0;
>
> # 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,
--
Olivier Miakinen
Voir mes rᅵponses ci-dessous.
Merci beaucoup pour votre rᅵponse.
Bien ᅵ vous.
Amicalement.
Jean-Franᅵois Ortolo
Le 14/01/2010 02:09, Olivier Miakinen a ᅵcrit :
> 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.
>
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 ).
>>
>> # 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 = '"/" . ';
>
Effectivement avec des quotes simples ᅵa marche aussi. Et
effectivement c'est mieux de mettre un espace avant et aprᅵs le point.
Merci d'avoir corrigᅵ. ;)
> 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.
>> 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 !)
Pardon.
Il me semble, que le point est la seule possibilitᅵ d'opᅵrateur de
concatᅵnation en php. La juxtaposition pure n'est pas conforme ᅵ la
syntaxe de php, et dᅵclenche une erreur de parsing. ( J'ai testᅵ sur mon
ordinateur en php 5.2.11 ). D'autre part les noms de variables ne
doivent pas par dᅵfinition contenir de point, sinon c'est considᅵrᅵ
comme une concatᅵnation avec ce qui suit.
Et puis, comment pourrait-il y avoir des espaces dans des noms de
variables ? Voici ce qui figure dans le PHP Manual :
"Un nom de variable valide doit commencer par une lettre ou un
soulignᅵ (_), suivi de lettres, chiffres ou soulignᅵs."
>
>> 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 ! ;-)
>
S'il y a un ou des espaces ᅵ la fin du nom de variable, il seront
accolᅵs ᅵ la fin du nom de la variable, donc copiage fidᅵle de
l'original, aucun problᅵme ?
Je ne sais pas trᅵs bien ce qui se passe si l'on essaye d'ajouter un
espace contenu dans une variable, en fin de variable :
t=' ';
chaine="abc";
chaine=chaine t;
chaine= chaine "def";
A ce moment-lᅵ, chaine contient : "abc def" ou "abcdef" ?
Dans le premier cas mon code est juste, cependant je ne sais pas ce
qui se passe lors de l'exᅵcution du code dans le deuxiᅵme cas.
>>
>> 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.
>
Peut-ᅵtre pour Windows ? ;)
>> [...]
>> 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.
>
Je reconnais, que le problᅵme est la reconnaissance du pattern du nom
de la fonction incluse, ce qui nᅵcessite du traitement complᅵmentaire si
plusieurs noms de fonctions possibles commencent avec la mᅵme lettre.
>>
>> 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 ;
Je pourrais, effectivement, mais mon procᅵdᅵ revient au mᅵme.
> - comment tu gᅵres les \$, \" et \'.
>
J'ai besoin de savoir combien il y a d'ᅵchappements successifs, avant
un caractᅵre diffᅵrent de "\".
Si ce nombre est pair, le caractᅵre suivant n'est pas ᅵchappᅵ, et il
faut l'ᅵchapper quand mᅵme dans la regexp modifiᅵe, dans certains cas.
Pour le cas des \$, \" et \', ces caractᅵres sont ᅵchappᅵs au dᅵpart
comme ᅵ l'arrivᅵe, donc il n'est pas nᅵcessaire de faire un traitement
particulier d'ᅵchappement.
>
>> 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) ?
>
Effectivement, je n'y avais pas pensᅵ, parfois je ne sais pas ce qui
me passe par la tᅵte... ;(
>> [...]
>
> 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,
J'ajoute :
Aprᅵs le code qui suit, il faut rajouter quote_trouve=0; , car dans
ce cas, cette variable est diffᅵrente de 0, ce qui impacterait les
analyses ultᅵrieures dans la mᅵme fonction, des sous-regexp chaᅵnes de
caractᅵres.
while((i<=p)&&(quote_trouve==0))
{
# Code...
}
quote_trouve=0;
D'autre part, il est bon pour simplifier, de rᅵduire les deux
fonctions change(param) et change_i(param), ᅵ une seule fonction
change(param, chaine_fin)
chaine_fin sera le deuxiᅵme paramᅵtre d'appel ᅵ change(), qui sera la
chaᅵne de caractᅵre ᅵ rajouter en fin de regexp, donc ' . "/"' pour
change(), et ' . "/i"' pour change_i().
Donc, dans le corps principal de filtre.awk, on remplacera les appels
ᅵ ces deux fonctions par :
v=change(u, ' . "/"'); au lieu de v=change(u); , et
v=change(u, ' . "/i"'); au lieu de v=change_i(u);
Dans la fonction change(param, chaine_fin) , on remplacera ces
instructions :
chaine=chaine ".\"/\",";
chaine=chaine ".\"/i\",";
par :
chaine= chaine chaine_fin ",";
vers la fin de la fonction change()
Compte tenu des modifications de Monsieur Miakinen, il n'yaurait plus
qu'ᅵ trouver une alternative ᅵ p=split(param, tableau, ""); , pour
sᅵlectionner chacun des caractᅵres de param, associᅵs ᅵ un indice i
allant de i=1 ᅵ i=length(param).
Il reste le problᅵme du caractᅵre "/" non ᅵchappᅵ dans la regexp de
dᅵpart. A chaque fois que je programme ( seulement avec des regexp posix
jusqu'ᅵ prᅵsent ), je me pose la question : Faut-il ou non ᅵchapper "/"
? Je croyais qu'il ᅵtait obligatoire d'ᅵchapper ce caractᅵre, mais
peut-ᅵtre me suis-je trompᅵ... A ce moment-lᅵ, je pense que je n'aurais
pas d'autre solution, que de choisir un autre caractᅵre de dᅵbut et fin
de regexp, dont je sois sᅵr qu'il n'apparaᅵt jamais dans les regexp.
Problᅵme insoluble ?
En tout cas, Monsieur Miakinen, je vous suis trᅵs trᅵs reconnaissant
d'avoir indiquᅵ les erreurs dans ce code, car je vais prochainement
tester sur un autre serveur, la migration de mon site partenaire
www.lescourses.com , et si ᅵa ne marche paaaasss... le dirlo ne sera
poas content ;)
Avec mes respects.
Bien ᅵ vous.
Amicalement.
Jean-Franᅵois Ortolo
--
Visitez le site http://www.pronostics-courses.fr/
donnant des Statistiques, Pronostics et Historiques graphiques
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().
Merci beaucoup de votre rᅵponse.
Bien ᅵ vous.
Amicalement.
Jean-Franᅵois Ortolo
--
Ca ne marcherait pas.
Essentiellement, car la regexp pcre utilisᅵe dans cette fonction
preg_replace, serait soumise ᅵ la mᅵme limitation que prᅵcᅵdemment dans
le choix du caractᅵre dᅵlimiteur.
Le problᅵme est, que l'on peut ᅵvaluer les caractᅵres existants dans
une chaᅵne constante de caractᅵres, mais pas dans une variable php.
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 ).
Problᅵme conjoncturel donc, et qui ne peut pas ᅵtre automatisable.
Il va donc falloir, que je loggue tous les scripts php oᅵ
apparaissent au moins une variable php dans le premier paramᅵtre des
fonctions ᅵ migrer, et que je regarde dans chacun de ce scripts, quel
serait le meilleur caractᅵre dᅵlimiteur, qui n'apparaisse dans aucune de
ces variables.
Conclusion, du pain sur la planche en perspective... ;)
Mais... Je peux ᅵventuellement logguer aussi toutes les variables php
associᅵes ᅵ ces scripts php, et faire du traitement rᅵpᅵtitif
d'affichage de toutes les lignes de ces scripts, oᅵ elles apparaissent,
ce qui me donnera toutes les instructions d'affectation de ces variables.
De l'ᅵ peu prᅵs, quoi... ;)
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).
>>> 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.
D'accord, c'est certainement de ma faute car je n'ai pas compris comment
tu traitais vraiment les \ au sein d'une 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.
Dans ce cas, tu peux aussi bien le faire avec / qu'avec # (qui risque
d'ailleurs peut-être de se trouver plus facilement non échappé que /).
Un autre problème est que tout caractère peut aussi bien être caché
dans une variable.
> Le seul problème, est que je ne sais pas comment faire un tel
> remplacement avec preg_replace().
Je viens de te répondre dans fclr. Au passage, je vois que tu as vu
aussi l'autre problème que je te signale.
À 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,
--
Olivier Miakinen
grep "ᅵ" $(find . -name "*.php")
... et si tu trouves ne serait-ce qu'un seul ᅵ, tu essayes avec ᅵ,
avec ᅵ, avec ᅵ, et ainsi de suite jusqu'ᅵ en trouver un qui ne se
trouve utilisᅵ nulle part !
Finalement...
J'ai loggué dans un fichier, tous les scripts et les variables (
chaque fichier sur une seule ligne ) où des variables apparaissent dans
les regexp des fonctions à migrer, et puis j'ai fait des cat répétitifs
à partir de ce fichier de log, des fichiers correspondants, en ne
sélectionnant que les lignes où apparaissent ces variables, avec un
script en Bourne Shell. Le résultat a été placé dans un autre fichier de
logs tmp.txt, dont j'ai fait un 'cat tmp.txt | egrep -e "\/" > logs.txt'
dans un autre script Shell, pour sélectionner uniquement les lignes
comportant des caractères "/", pour voir si ce caractère est toujours
échappé dans les affectations à ces variables. Ensuite j'ai éliminé les
lignes commençant par / , car c'étaient les chemins absolus des
fichiers, pour ne laisser que les variables.
Il se trouve que dans toutes les variables apparaissant comme premier
paramètre dans ces fonctions à migrer, le caractère "/" est toujours
échappé par "\".
Donc, ce caractère "/" peut servir ce caractère délimiteur, en tenant
compte du fait que, pour les regexp ou sous-regexp constantes chaînes de
caractères des fonctions à migrer, le caractère délimiteur doit toujours
être échappé, ce pourquoi j'ai fait une petite modification dans le
script filtre.awk
Le problème est donc résolu, mon site partenaire ( sa copie sur mon
ordinateur ) a été migré ce soir sans erreur.
Et puis j'ai corrigé une petite erreur, où j'échappais aussi les
quotes simples ou doubles de fin des sous-regexp constantes avant
migration. Maintenant tout est correct.
Merci beaucoup Monsieur, pour vos réponses et encouragements.
Bien à vous.
Amicalement.
Jean-François Ortolo
--
Visitez le site http://www.pronostics-courses.fr/
donnant des Statistiques, Pronostics et Historiques graphiques
très élaborés.
Les Statistiques sont calculées d'après une base de données
allant du 1er Janvier 2000 jusqu'à très récemment.
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 problème du caractère délimiteur est résolu en ce qui me concerne,
car dans toutes les variables servant de regexp aux fonctions à migrer,
tous les caractères "/" sont échappés. Ce caractère "/" peut donc
service de délimiteur.
Merci beaucoup beaucoup pour vos réponses.
Bien à vous.
Amicalement.
Jean-François Ortolo
--
Visitez le site http://www.pronostics-courses.fr/
donnant des Statistiques, Pronostics et Historiques graphiques
très élaborés.
Les Statistiques sont calculées d'après une base de données
allant du 1er Janvier 2000 jusqu'à très récemment.
> 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... ;(
L'euro n'apparaît pas dans le jeu iso-8859-1 (latin 1) mais dans le
iso-8859-15 (latin 9) auquel cas il est disponible par <AltGr>+E ou
<Ctrl>+<Alt>+E (au moins sous windows)
Voir http://www.cs.tut.fi/~jkorpela/latin9.html (en anglais)
--
Greetings, Salutations,
Guiraud Belissen, Château du Ciel, Drachenwald,
Chris CII, Rennes, France
Bonsoir Monsieur
Effectivement, sous vi j'arrive à faire apparaître le signe euro en
faisant <AltGr>+E, que E soit minuscule ou majuscule.
Donc il semble que le mode latin utilisé soit latin9, bien que le
fichier /etc/vimrc mentionne seulement latin.
Il est vrai que c'est moi qui ait fait la manip de configurer ce
fichier en mode latin, alors que par défaut il est en mode utf8.
Merci beaucoup de votre réponse, je vais maintenant essayer de faire
apparaître un signe euro sur ce Thunderbird version 3.0 sous Linux
Fedora 11 64 bits.
Attention... € C'est gagné !
Remerci beaucoup pour votre réponse.
Je vais bient�t passer � l'�tape suivante : Migration des fonctions
mysql_*() , vers l'interface objet PDO d'acc�s � MySQL.
Pour cel�, j'ai besoin d'une information sur php, php 6 en particulier.
Supposons une classe ( mettons de type MyPDO extends PDO ),
instanci�e en objet $conn donnant la r�f�rence avec laquelle on
construit les requ�tes ( $conn->query($sql) , $conn->exec($sql) ).
Les connexions � MySQL se font mettons avec la fonction aconnect(),
l'objet ( la variable ) $conn, la fonction aconnect() est d�finie dans
un script script_connexion.php inclus au d�but des scripts php, et
contient l'instruction classique de connexion � MySQL fa�on PDO. ( $conn
= new MyPDO( etc... ); , avec classique traitement d'erreur.
Cette fonction aconnect(void), instancifie donc l'objet $conn, qui
est global, et est utilis� dans les scripts, simplement en le d�clarant
global.
On a donc :
<?php
include("script_connexion.php");
global($conn;
aconnect();
... Et � ce moment-l�, l'objet $conn sera-t-il effectivement
disponible pour des requ�tes genre $conn->query($sql) ou
$conn->exec($sql) ?
C'est ma premi�re question.
Ma deuxi�me question, c'est de savoir si l'objet $conn, instancifi�
dans le corps du script php ( aconnect(); ) sera aussi disponible dans
une fonction ou $conn est d�lar� global ?
Par exemple :
<?php
include("script_connexion.php");
global $conn;
aconnect();
function example() {
global $conn;
Ma question : $conn sera-t-il disponible pour des requ�tes
de type $conn->query($sql) ou $conn->exec($sql) ?
}
Enfin, ma derni�re question, c'est de savoir si c'est aussi le cas (
$conn disponible pour des requ�tes ) si la fonction example() est
d�clar�e avant le d�clenchement de aconnect(); , mais que la fonction
aconnect() est d�clench�e avant l'appel � la fonction example()?
Merci beaucoup de vos r�ponses, je reconnais que mes questions sont
surtout relatifs � la port�e des variables globales, et � la
Programmation Orient�e Objet sous php, mais j'esp�re que le mod�rateur
va laisser passer mon message...
J'ai la r�ponse � ma question.