[PHP] Remplacer preg_replace par preg_replace_callback

Remplacer preg_replace par preg_replace_callback [PHP] - PHP - Programmation

Marsh Posté le 19-07-2015 à 13:48:54    

Hello  [:dawa]  
 
Depuis que j'ai installé une version plus récente de PHP j'ai un message d'erreur pour un de mes preg_replace :  
 

Code :
  1. $text = preg_replace("#\[img\]((http|ftp|https|ftps)://)([^ \?&=\#\"\n\r\t<]*?(\.(jpg|jpeg|gif|png)))\[/img\]#sie", "'[img:$uid]\\1' . str_replace(' ', '%20', '\\3') . '[/img:$uid]'", $text);


 

Code :
  1. Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /Users/eriksma/Documents/Sites Web/newsma/bbcode.php on line 309


 
J'ai tant bien que mal essayé de réparer ça par moi-même en fouillant les interwebs :  
 

Code :
  1. $text = preg_replace_callback("#\[img\]((http|ftp|https|ftps)://)([^ \?&=\#\"\n\r\t<]*?(\.(jpg|jpeg|gif|png)))\[/img\]#sie", create_function("$matches","return '[img:$uid]$matches[3]' . str_replace(' ', '%20', '$matches[3]') . '[/img:$uid]';" ), $text);


 
Mais ça ne passe pas :  
 

Code :
  1. Notice: Undefined variable: matches in /Users/eriksma/Documents/Sites Web/newsma/bbcode.php on line 311
  2. Notice: Undefined variable: matches in /Users/eriksma/Documents/Sites Web/newsma/bbcode.php on line 311
  3. Notice: Undefined variable: matches in /Users/eriksma/Documents/Sites Web/newsma/bbcode.php on line 311
  4. Warning: preg_replace_callback(): Modifier /e cannot be used with replacement callback in /Users/eriksma/Documents/Sites Web/newsma/bbcode.php on line 311
  5. Notice: Undefined variable: matches in /Users/eriksma/Documents/Sites Web/newsma/bbcode.php on line 311
  6. Notice: Undefined variable: matches in /Users/eriksma/Documents/Sites Web/newsma/bbcode.php on line 311
  7. Notice: Undefined variable: matches in /Users/eriksma/Documents/Sites Web/newsma/bbcode.php on line 311
  8. Warning: preg_replace_callback(): Modifier /e cannot be used with replacement callback in /Users/eriksma/Documents/Sites Web/newsma/bbcode.php on line 311


 
Bon le souci c'est que les expressions régulières c'est pas mon point fort et que ce preg_replace il vient d'un script tout fait pour convertir les bbcode... alors là je galère :/  
 
Quelqu'un aurait une idée et serait assez cool pour me dépanner ?  
 
Merci !  [:dawa]


---------------
SHOOT ME AGAIN WEBZINE
Reply

Marsh Posté le 19-07-2015 à 13:48:54   

Reply

Marsh Posté le 19-07-2015 à 19:44:09    

Ben au vu de la doc, ça devrait être ceci, non?
 
$text = preg_replace_callback("#\[img\]((http|ftp|https|ftps)://)([^ \?&=\#\"\n\r\t<]*?(\.(jpg|jpeg|gif|png)))\[/img\]#si",  
                                         function($matches) { return '[img:$uid]$matches[1]' . str_replace(' ', '%20', '$matches[3]') . '[/img:$uid]'; },
                                         $text);
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 20-07-2015 à 19:39:06    

De mémoire, en php, les guillemets simples ['] désactivent la substitution des variables dans les chaines de caractères. Il ne faudrait pas plutôt  

Code :
  1. $text = preg_replace_callback(
  2.             "#\[img\]((http|ftp|https|ftps)://)([^ \?&=\#\"\n\r\t<]*?(\.(jpg|jpeg|gif|png)))\[/img\]#si",
  3.             function($matches) {
  4.                      return '[img:$uid]'.$matches[1] . str_replace(' ', '%20', $matches[3]) . '[/img:$uid]';
  5.             },
  6.             $text);


???
(j'ai viré les guillemets simples autour du $matches[1] et $matches[3])
 
Cordialemnt,


Message édité par dreameddeath le 20-07-2015 à 19:40:48
Reply

Marsh Posté le 20-07-2015 à 21:45:35    

> Il ne faudrait pas plutôt  ...
Oui, très certainement.
A+,


Message édité par gilou le 20-07-2015 à 21:46:07

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 21-07-2015 à 10:49:34    

Hey merci beaucoup pour votre aide !  
 
Alors la solution de dreameddeath marche "presque" :D  
 
Alors je n'ai plus de notice, pas de message d'erreur et le replace se fait bien sauf que :  
 
Le résultat qu'il me donne est par exemple :  
 

Code :
  1. [img:$uid]http://img4.hostingpics.net/pics/824347vistachino3.jpg[/img:$uid]


 
Alors qu'il devrait convertir ma variable  [:kolombin]  
 
Mais bon juste derrière j'ai ajouté ceci :  
 

Code :
  1. $text=str_replace("uid",$uid,$text);
  2. $text=str_replace("$","",$text);


 
Et ça fonctionne, même si c'est pas 100% propre nickel  [:boulax:4]  
 
Merci pour votre aide !  [:dawa]


---------------
SHOOT ME AGAIN WEBZINE
Reply

Marsh Posté le 21-07-2015 à 15:00:18    

A la place de ceci:
    [img:$uid]http://img4.hostingpics.net/pics/824347vistachino3.jpg[/img:$uid]
Tu devrais avoir quoi?
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 21-07-2015 à 20:11:53    

[img:80451215]http://img4.hostingpics.net/pics/824347vistachino3.jpg[/img:80451215] ou tout autre nombre aléatoire défini plus haut dans la fonction !


Message édité par Dawa le 21-07-2015 à 20:12:09

---------------
SHOOT ME AGAIN WEBZINE
Reply

Marsh Posté le 21-07-2015 à 22:53:44    

Cette modification devrait alors marcher je pense:
...
function ($matches) use (&$uid) {
                     return '[img:' . $uid . ']'. $matches[1] . str_replace(' ', '%20', $matches[3]) . '[/img:' . $uid . ']';
            },
...
 
EDIT:
Et en y repensant, celle ci devrait être encore plus simple:
$text = '[img:' . $uid . ']'. preg_replace_callback("#\[img\]((http|ftp|https|ftps)://)([^ \?&=\#\"\n\r\t<]*?(\.(jpg|jpeg|gif|png)))\[/img\]#si",  
                                         function($matches) { return $matches[1] . str_replace(' ', '%20',$matches[3]); }, $text) . '[/img:' . $uid . ']';
 
ou en plus découpé:
$text = preg_replace_callback("#\[img\]((http|ftp|https|ftps)://)([^ \?&=\#\"\n\r\t<]*?(\.(jpg|jpeg|gif|png)))\[/img\]#si",  
                                         function($matches) { return $matches[1] . str_replace(' ', '%20',$matches[3]); }, $text);
$text = '[img:' . $uid . ']'. $text . '[/img:' . $uid . ']';
 
Bref, au lieu de coller les [img:$uid] autour dans l'expression de remplacement, on fait le remplacement d'abord, et on colle les [img:$uid] autour ensuite.
 
A+,


Message édité par gilou le 21-07-2015 à 23:30:37

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

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