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

  FORUM HardWare.fr
  Programmation
  PHP

  Pb de eregi_replace

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Pb de eregi_replace

n°1139568
fabowl
Posté le 04-07-2005 à 16:56:50  profilanswer
 

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

mood
Publicité
Posté le 04-07-2005 à 16:56:50  profilanswer
 

n°1139573
soju
One shot !
Posté le 04-07-2005 à 17:00:51  profilanswer
 

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

n°1139576
masklinn
í dag viðrar vel til loftárása
Posté le 04-07-2005 à 17:02:25  profilanswer
 

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?
n°1139594
fabowl
Posté le 04-07-2005 à 17:24:31  profilanswer
 

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 !
 

n°1139667
sielfried
Posté le 04-07-2005 à 18:35:31  profilanswer
 

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


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
n°1139736
afbilou
pouet your life
Posté le 04-07-2005 à 20:18:30  profilanswer
 

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

n°1139747
sielfried
Posté le 04-07-2005 à 20:33:24  profilanswer
 

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
n°1139748
afbilou
pouet your life
Posté le 04-07-2005 à 20:38:25  profilanswer
 

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
n°1139754
sielfried
Posté le 04-07-2005 à 20:43:43  profilanswer
 

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
n°1139756
afbilou
pouet your life
Posté le 04-07-2005 à 20:45:43  profilanswer
 

v voir ca [:petrus%20dei]

mood
Publicité
Posté le 04-07-2005 à 20:45:43  profilanswer
 

n°1143302
fabowl
Posté le 07-07-2005 à 14:59:09  profilanswer
 

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 ?

n°1143317
masklinn
í dag viðrar vel til loftárása
Posté le 07-07-2005 à 15:10:37  profilanswer
 

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?
n°1143323
fabowl
Posté le 07-07-2005 à 15:19:32  profilanswer
 

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

n°1143329
masklinn
í dag viðrar vel til loftárása
Posté le 07-07-2005 à 15:20:44  profilanswer
 

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?
n°1143331
fabowl
Posté le 07-07-2005 à 15:21:45  profilanswer
 

lol
en tout cas merci pour le coup de pouce !

n°1143332
sielfried
Posté le 07-07-2005 à 15:23:27  profilanswer
 

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
n°1143340
sielfried
Posté le 07-07-2005 à 15:27:23  profilanswer
 

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
n°1143350
masklinn
í dag viðrar vel til loftárása
Posté le 07-07-2005 à 15:32:29  profilanswer
 

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?
n°1143358
sielfried
Posté le 07-07-2005 à 15:41:53  profilanswer
 

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

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

  Pb de eregi_replace

 

Sujets relatifs
prob preg_replacepb avec fonction eregi_replace
[MySQL] Problème avec Replacey'a t il une fonction C qui remplace la fonction c++ string.replace?
Problème pour ajouter du texte après <body.> avec ereg_replace[RESOLU]fonction eregi php
str_replace qui ne fonctione pas ...regex et preg_replace()
Petite question sur ereg_replace [résolu] 
Plus de sujets relatifs à : Pb de eregi_replace


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)