Pb de eregi_replace

Pb de eregi_replace - PHP - Programmation

Marsh Posté le 04-07-2005 à 16:56:50    

Bonjour,
 
J'aimerais utiliser les expressions régulières pour créer des liens dans un texte.
 
Exemples :

Code :
  1. // EX 1 OK
  2. //[LIEN -> http://www.monsite.fr]
  3. // EX 2 PAS OK
  4. //[TEXTE DU LIEN -> http://www.monsite.fr]
  5. function convertToLink($texte) {
  6. // [Mon lien -> http://www.google.fr]
  7. $pattern = '\[([^ <]*) -> ([^ <]*)\]';
  8. $remplace = ' <a href="\\2" target="_blank">\\1</a>';
  9. $texte = eregi_replace($pattern, $remplace, $texte);
  10. return $texte;
  11. }


 
Ma fonction marche sauf qu'elle ne gère pas les espaces dans le texte du lien (ex 1 fonctionne mais pas le 2)
Qu'est c equ'il me manque dans mon pattern pour que ça fonctionne ?
 
Merci

Reply

Marsh Posté le 04-07-2005 à 16:56:50   

Reply

Marsh Posté le 04-07-2005 à 17:00:51    

normal car tu n'autorises pas les espaces dans ton masque ([^ <]*)
et utilises preg_replace, c'est plus performant et ya plus d'options

Reply

Marsh Posté le 04-07-2005 à 17:02:25    

soju a écrit :

normal car tu n'autorises pas les espaces dans ton masque ([^ <]*)
et utilises preg_replace, c'est plus performant et ya plus d'options


il interdit explicitement les espaces, même [:aloy]


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
Reply

Marsh Posté le 04-07-2005 à 17:24:31    

masklinn a écrit :

il interdit explicitement les espaces, même [:aloy]


 
lol forcément ça risque de ne pas bien marcher ...  Les copier coller à partir de codes trouvés sur le net, c'est pas top ... :pt1cable:  
 
Par contre, vu que je suis novice dans les expressions régulières, est-ce que vous pourriez me donnez le masque qu'il me faudrait ?
 
Merciiii !
 

Reply

Marsh Posté le 04-07-2005 à 18:35:31    

$pattern = '#\[(.+) -> ([^ \]]+)\]#';
 
Avec preg_replace, ça devrait le faire.


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 04-07-2005 à 20:18:30    

Il ne faut pas echapper ] lorsqu'il est dans une definition de classe [] car tous les caracteres perdent leur meta-sens dans une definition de classe.
 
Pour le cas particulier de ] et - il faut les placer en derniere posision.
- peut etre placé en premiere (il me semble) position egalement.
En consequence ... dans ton exemple le \] repesente le caractere \ et le ].

Reply

Marsh Posté le 04-07-2005 à 20:33:24    

Ah vi, il me semble avoir déjà entendu ça qqpart.
 
Cela dit après test, il ne semble pas qu'un \ dans l'URL (à droite de "->" ) change quoi que ce soit au résultat de preg_replace, que ce soit avec ou sans l'échappement du ]... [:figti]


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 04-07-2005 à 20:38:25    

sielfried a écrit :

Cela dit après test, il ne semble pas qu'un \ dans l'URL (à droite de "->" ) change quoi que ce soit au résultat de preg_replace, que ce soit avec ou sans l'échappement du ]... [:figti]


Ben etant donné que l'url ne contient pas de '\' il n'y aura aucun probleme mais le pattern est tout de meme faux.


Message édité par afbilou le 04-07-2005 à 20:43:15
Reply

Marsh Posté le 04-07-2005 à 20:43:43    

Ben tu dis que \] dans mon truc représente \ et ].
 
Donc ça devrait merder quand l'url à droite de la flèche contient un \ en plein milieu. Mais c'est pas le cas.
 
En fait ça réagit exactement pareil en échappant ou pas.


Message édité par sielfried le 04-07-2005 à 20:44:30

---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 04-07-2005 à 20:45:43    

v voir ca [:petrus%20dei]

Reply

Marsh Posté le 04-07-2005 à 20:45:43   

Reply

Marsh Posté le 07-07-2005 à 14:59:09    

Alors, j'ai fait des tests avec  
 

Code :
  1. $pattern = '#\[(.+) -> ([^ \]]+)\]#';


 
de sielfried
 
Voici mon jeu de tests :
 
1) [Lien -> http://www.google.fr]
2) [Mon lien -> http://www.google.fr]
3) Voici un autre [lien -> http://www.google.fr], ici, et un autre [là -> http://www.google.fr].
 
- Les 2 premiers liens fonctionnent très bien, avec un ou plusieurs mots.
- La 3e ne marche pas. En fait, quand il y a plusieurs liens sur une même ligne (sans retour charriot en fait), ça merdouille ! Voilà le code HTML créé pour ces 3 lignes :
 

Code :
  1. <a href="http://www.google.fr" target="_blank">Lien</a><br />
  2. <a href="http://www.google.fr" target="_blank">Mon lien</a><br />
  3. Voici un autre  <a href="http://www.google.fr" target="_blank">lien -> http://www.google.fr], ici, et un autre [là</a>.<br />


 
En fait, il va chercher le dernier "]" qu'il peut trouver dans le paragraphe.
 
Une solution ?

Reply

Marsh Posté le 07-07-2005 à 15:10:37    

Un truc du genre

\[(.*?) ?-> ?([^ \]]+?)\]


(fait chier que le moteur regex de PHP ne comprenne pas "\s" )
 
Accessoirement, cette regex fonctionnera même si tu oublies des espaces (genre [lien->http://www.google.com])


Message édité par masklinn le 07-07-2005 à 15:11:51

---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
Reply

Marsh Posté le 07-07-2005 à 15:19:32    

Génial ça marche !
Par contre, il faut mettre des "#" autour de l'expresssion réguliere. Je sais pas pourquoi ... à quoi ça sert ?
 
Je poste la fonction complète pour ceux que ça intéresse ...  ;)  
 

Code :
  1. function convertToLink($texte) {
  2. // Exemple :
  3. // texte avant [Mon lien -> http://www.google.fr] texte après [Un autre lien -> http://www.hardware.fr].
  4. $pattern = '#\[(.*?) ?-> ?([^ \]]+?)\]#';
  5. $remplace = ' <a href="\\2" target="_blank">\\1</a>';
  6. $texte = preg_replace($pattern, $remplace, $texte);
  7. return $texte;
  8. }

Reply

Marsh Posté le 07-07-2005 à 15:20:44    

Aucune idée, je fais pas de regex en PHP moi :o
J'utilise des vrais langages avec des vrais modules, genre Python "re" :o


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
Reply

Marsh Posté le 07-07-2005 à 15:21:45    

lol
en tout cas merci pour le coup de pouce !

Reply

Marsh Posté le 07-07-2005 à 15:23:27    

masklinn a écrit :

Un truc du genre

\[(.*?) ?-> ?([^ \]]+?)\]


(fait chier que le moteur regex de PHP ne comprenne pas "\s" )
 
Accessoirement, cette regex fonctionnera même si tu oublies des espaces (genre [lien->http://www.google.com])


 
Ah ben wai, fallait de la "lazyness". Ca devrait être par défaut ce truc, ça sert si souvent. :o


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 07-07-2005 à 15:27:23    

fabowl a écrit :

Génial ça marche !
Par contre, il faut mettre des "#" autour de l'expresssion réguliere. Je sais pas pourquoi ... à quoi ça sert ?


 
Il faut un délimiteur autour de la regexp. En général on met \, mais n'importe quel autre car non alphanumérique peut faire l'affaire. Si tu dois l'utiliser dans le masque par contre, faudra l'échapper avec \ dans ce cas.
 
Je trouve # plus clair que \ donc je l'utilise, ce n'est qu'une question de goût.


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 07-07-2005 à 15:32:29    

sielfried a écrit :

Ah ben wai, fallait de la "lazyness". Ca devrait être par défaut ce truc, ça sert si souvent. :o


Chez moi c'est pas "lazy" c'est "non greedy" (+ et * étant considéré comme des qualificateurs "greedy" )
Je trouve ça à la fois beaucoup plus clair et plus sympa :o


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
Reply

Marsh Posté le 07-07-2005 à 15:41:53    

masklinn a écrit :

Chez moi c'est pas "lazy" c'est "non greedy" (+ et * étant considéré comme des qualificateurs "greedy" )
Je trouve ça à la fois beaucoup plus clair et plus sympa :o


 
Voui bon, hein, on s'est compris. :o  
 
 :)


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Sujets relatifs:

Leave a Replay

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