Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1881 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  [php / perl] preg_replace et expression rationnelle perl, le retour

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[php / perl] preg_replace et expression rationnelle perl, le retour

n°1353611
madkat
Posté le 25-04-2006 à 14:39:39  profilanswer
 

Bonjour tout le monde,
 
Dans le cadre d'un projet je dois convertir une partie d'un script perl en php.
Le script perl en question prend un fichier troff en entrée (pages de man unix) et le converti en html.
 
Dans mon script en perl j'ai pas mal de regexp ou les patterns sont constitués en partie de variable, comme

s,\\\*\((..),$vars{$1},ge;


C'est possible de faire sensiblement la même chose en php ?
Ou il faut que je fasse une grosse bidouille genre

Code :
  1. if (preg_match("%\\\*\((..)%ge",$line,$matches)
  2. {
  3.      $pattern = $vars[$matches[1]];
  4.      preg_replace("%\\\*\(..%ge",$pattern,$line);
  5. }


 
Merci de votre aide.
 
Ancien post :

Citation :

J'ai pas mal avancé dans ma traduction mais je butte sur une certaine regexp :

s,\s*\\".*$,,

que je pensais traduire par

preg_replace("#\s*\\".*$#",,$line);


mais ca ne marche pas, j'ai un message d'erreur sur la deuxième étoile.
 
Quelqu'un pourrait il m'aider ?
 
J'ai une deuxième question : dans la doc officielle de php sur les patterns pour les regexp, on trouve des patterns encadrés par des /, des #, des % ou des @ (/pattern/,#pattern#, ....).
 
Je n'ai pas réussi à trouver la doc sur leur signification, quelqu'un pourrait il m'éclairer ?
 
Merci d'avance :jap:


Message édité par madkat le 01-05-2006 à 17:56:38
mood
Publicité
Posté le 25-04-2006 à 14:39:39  profilanswer
 

n°1353693
madkat
Posté le 25-04-2006 à 15:52:30  profilanswer
 

Autoréponse à l'ancien post :
 
Bon j'ai fini par la traduire comme ça :

preg_replace("%\s*?\\\".*$%","%%",$line);


Message édité par madkat le 01-05-2006 à 16:43:46
n°1357246
madkat
Posté le 01-05-2006 à 16:44:39  profilanswer
 

[:_deckard_]
 
Nouvelle question :D

n°1357257
madkat
Posté le 01-05-2006 à 17:15:37  profilanswer
 

Je viens de voir qu'on peut faire des appels de fonctions dans les patterns de remplacement, comme ici par exemple, tiré de la doc officielle (dans les commentaires) :

Code :
  1. preg_replace( "! \{(.+)-(.+)\} !e", "my_function('\\1', '\\2')", $input_string );


 
Alors je me gourre d'erreur ou on ne peut vraiment pas faire ce que je cherche à faire ?
Dans ce cas je peux faire une fonction genre  

Code :
  1. function vars($vars,$asked)
  2. {
  3.     return $vars[$asked];
  4. }
  5. preg_replace("%\\\*\((..)%ge","vars(&$vars, $1)",$line);


 
Vous en pensez quoi ?
 
PS: désolé si je floode un peu mais j'ai pris du retard la faut que j'avance, et un petit coup de pouce pour me remettre sur les rails serait vraiment le bienvenu :)


Message édité par madkat le 01-05-2006 à 17:16:35
n°1357347
joce
Architecte / Développeur principal
"BugHunter"
Posté le 01-05-2006 à 20:13:29  profilanswer
 

preg_replace("%\\\*\((.+?)%es",'\$vars[\\1]',$line);  
 
?


Message édité par joce le 01-05-2006 à 20:14:26
n°1357386
madkat
Posté le 01-05-2006 à 21:03:11  profilanswer
 

Merci de ta réponse, ca a l'air de passer.
En fait j'avais des erreurs quand j'essayais de l'écrire

Code :
  1. preg_replace("%\\\*\((.+?)%es","%\$vars[\\1]%",$line);

mais plus maintenant.
 
Une autre erreur a du m'embrouiller  :sweat:

n°1357473
joce
Architecte / Développeur principal
"BugHunter"
Posté le 01-05-2006 à 23:56:41  profilanswer
 

heu pour le deuxième "" faut pas mettre de % % :o (et utilise '')


Message édité par joce le 01-05-2006 à 23:57:08
n°1357810
madkat
Posté le 02-05-2006 à 14:19:38  profilanswer
 

Merci.
 
Mais pourquoi utiliser des simples quotes ? normalement il faut des doubles quotes pour que les contenus soit interprété :??:
 
Sinon j'ai un problème à l'exécution sur cette regexp :

Code :
  1. preg_replace("%\\\((..)%e","\$special[\"$1\"]" || "\\($1\" )",$line);
  2. // Mais celle ci passe
  3. preg_replace("%\\\((..))%e","\$special[\"$1\"]" || "\\($1\" )",$line);


Je ne comprend pas pourquoi, normalement ca devrait matcher la chaine "\(xx" avec xx deux carractères quelconques, et il me crache une erreur de compilation :heink:
 
Si t'as une idée ca serait cool, sinon je continue à chercher ;)
 
:jap:

n°1357858
Djebel1
Nul professionnel
Posté le 02-05-2006 à 15:22:15  profilanswer
 

> Mais pourquoi utiliser des simples quotes ?
 
Parce que le pattern n'est pas interprété, au sens qu'on ne recherche pas de variables dedans


Message édité par Djebel1 le 02-05-2006 à 15:22:54
n°1357875
joce
Architecte / Développeur principal
"BugHunter"
Posté le 02-05-2006 à 15:42:59  profilanswer
 

madkat a écrit :

Merci.
 
Mais pourquoi utiliser des simples quotes ? normalement il faut des doubles quotes pour que les contenus soit interprété :??:
 
Sinon j'ai un problème à l'exécution sur cette regexp :

Code :
  1. preg_replace("%\\\((..)%e","\$special[\"$1\"]" || "\\($1\" )",$line);
  2. // Mais celle ci passe
  3. preg_replace("%\\\((..))%e","\$special[\"$1\"]" || "\\($1\" )",$line);


Je ne comprend pas pourquoi, normalement ca devrait matcher la chaine "\(xx" avec xx deux carractères quelconques, et il me crache une erreur de compilation :heink:
 
Si t'as une idée ca serait cool, sinon je continue à chercher ;)
 
:jap:


Parce qu'il faut mettre :
 
preg_replace("%\\\*\((..)%e","\$special[\"$1\"]" || "\\($1\&#034 )",$line);
 
ou alors  
 
preg_replace("%\((..)%e","\$special[\"$1\"]" || "\\($1\&#034 )",$line);
 
si tu t'en fous de l'etoile

Message cité 1 fois
Message édité par joce le 02-05-2006 à 15:44:48
mood
Publicité
Posté le 02-05-2006 à 15:42:59  profilanswer
 

n°1358002
madkat
Posté le 02-05-2006 à 18:10:19  profilanswer
 

joce a écrit :

Parce qu'il faut mettre :
 
preg_replace("%\\\*\((..)%e","\$special[\"$1\"]" || "\\($1\&#034 )",$line);
 
ou alors  
 
preg_replace("%\((..)%e","\$special[\"$1\"]" || "\\($1\&#034 )",$line);
 
si tu t'en fous de l'etoile


 
Désolé mais je comprends pas bien  :sweat:  
Avec la première, je vais matcher une chaine type "\*(xx" et "(xx" avec la deuxième non ?
Je vais tester mais mon script n'étant pas encore complètement traduit, je ne peux pas trop vérifier que ca a le comportement attendu :/
 
PS: quand je dis une chaîne type "\*(xx" ca veut dire qu'on retrouve littéralement cette chaîne dans le fichier (à part les xx).

n°1358020
joce
Architecte / Développeur principal
"BugHunter"
Posté le 02-05-2006 à 18:56:10  profilanswer
 

ba si tu veux matcher (xx, faut mettre \((..)
si tu mets \\\((..), ca veut dire que tu veux matcher \ avec un erreur de syntaxe derriere (pour matcher \, il faut ecrire \\\)

n°1358081
madkat
Posté le 02-05-2006 à 20:26:31  profilanswer
 

Ah ok, donc l'erreur viens du fait qu'il manque un \, je pensais que pour matcher \ on écrivait \\.
Je vais avoir certaines regexp à corriger moi :D
 
Edit : Ca ne marche pas non plus  :cry:  
Je cherche sans succès à traduire ca :

Code :
  1. // s,\\\((..),$special{$1}||"\\($1",ge;


Message édité par madkat le 02-05-2006 à 20:38:27
n°1363296
madkat
Posté le 10-05-2006 à 14:08:40  profilanswer
 

Salut tout le monde, je remonte ce topic parceque j'ai une petite question, je voudrais savoir si c'est possible en php d'utiliser des "sous tableaux" : J'ai un tableau T[], je voudrais utiliser le sous tableau T[x..y] avec y l'indice du dernier élément du tableau,
 
C'est faisable ?

n°1363300
sielfried
Posté le 10-05-2006 à 14:11:19  profilanswer
 
n°1363313
madkat
Posté le 10-05-2006 à 14:17:41  profilanswer
 

Merci c'est nickel :)

n°1370685
madkat
Posté le 19-05-2006 à 15:53:17  profilanswer
 

J'ai une question sur les variables globales et l'option register global de php :
 
Le script perl que je traduit s'appuie énormément sur les variables globales, donc je voudrais savoir si au sain d'un même fichier php il est possible d'utiliser des variables globales même si register global est à off.
 
Ca me permettrais d'éviter de mettre des tonnes de paramètres à toutes mes fonctions, et aussi de garder une certaine lisibilité dans le code.
 
J'ai essayé de mettre des 'global' devant mes déclarations de variables, mais ca n'a pas eu l'air très concluent, je ne sais pas si c'est du au register global ou a une autre erreur dans mon script.
 
Merci :jap:

n°1370701
Djebel1
Nul professionnel
Posté le 19-05-2006 à 16:06:53  profilanswer
 

Pour info sur les variables globales :  
http://fr3.php.net/manual/fr/security.globals.php
 
Mettre global devant une variable va malgré tout bien la rendre globale. Mais en fait ton problème vient du fait qu'en utilisant le register global, tu peux récupérer des variables sans te soucier d'où elles proviennent.
 
Par exemple, avec le register global sur off, pour récupérer une valeur envoyé en GET, tu dois utiliser $_GET['mavariable']
Avec un register global sur on, tu peux récupérer cette valeur simplement par $mavariable.
 
Donc dans ton script, tu dois remplacer les variables par leur équivalent avec super tableau ($_GET, $_POST, $_COOKIE, $_SESSION)
 
 
edit : sinon j'ai ptet mal compris ton problème. Pour répondre à ta question, oui on peut utiliser des variables globales même si le register_global est à off. La variable aura donc une portée extérieure à une fonction par exemple.

Message cité 1 fois
Message édité par Djebel1 le 19-05-2006 à 16:08:09
n°1373339
madkat
Posté le 23-05-2006 à 16:38:53  profilanswer
 

Djebel1 a écrit :

Pour info sur les variables globales :  
edit : sinon j'ai ptet mal compris ton problème. Pour répondre à ta question, oui on peut utiliser des variables globales même si le register_global est à off. La variable aura donc une portée extérieure à une fonction par exemple.


 
Merci pour cette réponse, c'est le comportement de php que j'espérais, mais visiblement après tests, ca ne marche pas :/
 
Tant pis, mes fonctions auront 15 paramètres chacunes.
 
edit: ah bah non c'est moi qui savait pas m'en servir.
'tain l'overbookage cay le mal, ca fait faire n'importe quoi :/


Message édité par madkat le 23-05-2006 à 17:14:27
n°1373412
Djebel1
Nul professionnel
Posté le 23-05-2006 à 17:48:52  profilanswer
 

ta fonction est récursive ? Parce qu'à part ça, je pense pas que le recours à des variables globales soient utiles. Si c'est juste pour ne pas avoir trop de paramètres à ta fonction, je te déconseille l'usage de variables globales : faut les trouver dans le code, s'assurer que rien d'autre ne les modifie, quand qqn d'autre reprend ton code c'est peu sur.

n°1373651
madkat
Posté le 23-05-2006 à 22:52:51  profilanswer
 

En fait je traduit un script perl en php, et c'est plein de sous fonctions.
 
En perl, les variables sont globales par défaut, et le développeur du script a bien utilisé ce comportement. Je ne pense pas que ce soit plus lisible de mettre les variables en argument plutôt que de mettre une liste de global $var1,...,$varn au début de la ligne, mais par contre, c'est vrai que moi je galère à savoir qu'est ce qui est variable globale ou pas.
 
[:zytrasnif] je vais bosser une bonne partie de la nuit je crois [:zytrasnif]

n°1373702
Djebel1
Nul professionnel
Posté le 24-05-2006 à 01:15:52  profilanswer
 

have fun :p

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  [php / perl] preg_replace et expression rationnelle perl, le retour

 

Sujets relatifs
[VBS] Aide sur expression régulièrelire un fichier excel à l'aide de perl
exécuter une macro excel depuis un script perlSOS : expression régulière avec EREGI_REPLACE()
Aide Javascript Expression regPeut-on lancer un logiciel grâce à perl??
[perl - DBD Oracle] comment l'installer[perl]: copie fichier1 vers fichier2 sauf le début
[perl embed] Probleme socket[SGBD] dBase, strings, replace et doubles
Plus de sujets relatifs à : [php / perl] preg_replace et expression rationnelle perl, le retour


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR