Bonsoir,

PHP Version 5.2.14

je viens de passer la soirée sur un bug étrange. J'ai tenté d'isoler le problème dans le code épuré suivant

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
<?php
$texte = '[lien NumLien=1]sfds[/lien]
camùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùklkkkkkkkkkkkkkkkkkkkkkjjhklllllllllllllllllllllllllllllllllllllllllllllllllll
camùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùklkkkkkkkkkkkkkkkkkkkkkjjhklllllllllllllllllllllllllllllllllllllllllllllllllll
camùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùklkkkkkkkkkkkkkkkkkkkkkjjhklllllllllllllllllllllllllllllllllllllllllllllllllll';
 
echo preg_replace('#\[lien (.*)NumLien=([0-9]+)(.*)(?: AfficheClics=([01]))?(.*)\](.*)\[/lien\]#s', 'bonjour',$texte);
?>
EDITION: j'ai remplacé le replace_callback par un replace car, après vérification, ils se trouve qu'elles se comportent exactement de la même façon (mais replace a l'avantage de ne pas attirer l'attention sur une fonction anonyme dans la résolution du problème).

Si tout fonctionne on devrait voir apparaître la chaîne inintelligible sur la page. Or la page est blanche, ce qui indique que preg_replace_callback a planté, ne renvoyant pas de texte.

MAIS j'ai trouvé 4 cas dans lesquels ça fonctionne à nouveau:

- on enlève l'option s.

- on réduit le nombre de caractères en supprimant une des lignes de la chaîne.

- on enlève la première ligne, elle qui colle à l'expression régulière (y compris si on la remplace par un nombre équivalant ou supérieur de caractères.

- on enlève de l'expression régulière par exemple le paramètre '(.*)' du milieu, qui se trouve juste avant '(?: AfficheClics...', ou bien son petit frère juste avant le crochet fermant échappé.

Qu'en pensez-vous?