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

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

Marsh Posté le 25-04-2006 à 14:39:39    

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
Reply

Marsh Posté le 25-04-2006 à 14:39:39   

Reply

Marsh Posté le 25-04-2006 à 15:52:30    

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
Reply

Marsh Posté le 01-05-2006 à 16:44:39    

[:_deckard_]
 
Nouvelle question :D

Reply

Marsh Posté le 01-05-2006 à 17:15:37    

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
Reply

Marsh Posté le 01-05-2006 à 20:13:29    

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


Message édité par joce le 01-05-2006 à 20:14:26
Reply

Marsh Posté le 01-05-2006 à 21:03:11    

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:

Reply

Marsh Posté le 01-05-2006 à 23:56:41    

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


Message édité par joce le 01-05-2006 à 23:57:08
Reply

Marsh Posté le 02-05-2006 à 14:19:38    

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:

Reply

Marsh Posté le 02-05-2006 à 15:22:15    

> 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
Reply

Marsh Posté le 02-05-2006 à 15:42:59    

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
Reply

Marsh Posté le 02-05-2006 à 15:42:59   

Reply

Marsh Posté le 02-05-2006 à 18:10:19    

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).

Reply

Marsh Posté le 02-05-2006 à 18:56:10    

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 \\\)

Reply

Marsh Posté le 02-05-2006 à 20:26:31    

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
Reply

Marsh Posté le 10-05-2006 à 14:08:40    

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 ?

Reply

Marsh Posté le 10-05-2006 à 14:17:41    

Merci c'est nickel :)

Reply

Marsh Posté le 19-05-2006 à 15:53:17    

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:

Reply

Marsh Posté le 19-05-2006 à 16:06:53    

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
Reply

Marsh Posté le 23-05-2006 à 16:38:53    

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
Reply

Marsh Posté le 23-05-2006 à 17:48:52    

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.

Reply

Marsh Posté le 23-05-2006 à 22:52:51    

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]

Reply

Marsh Posté le 24-05-2006 à 01:15:52    

have fun :p

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed