Bonjour
Je fréquente le forum depuis des années en tant que simple visiteur. Aujourd'hui, je me suis inscrit pour poster car j'ai trouvé un comportement bien étrange sur la fonction preg_replace_callback :
C'est dans un bout de code qui parse du html pour reformater des div avec des images. D'un point de vue fonctionnel, ce code fonctionne.
Voici le code :
Code : Tout sélectionner
function remplaceDl($matches) {
$a = '<div class=\'spip_documents_'.$matches[1].' spip_documents\'><img style=\''.$matches[5].'\' width=\''.$matches[3].'\' height=\''.$matches[4].'\' src=\''.$matches[2].'\'><div class=\'spip_doc_titre\'>'.$matches[6].'</div></div>';
return $a;
}
$patterns_float = "/<dl class='spip_document_\d* spip_documents spip_documents_(left|right|center).*<dt><img src='(.*)'.*width='(.*)'.*height='(.*)'.*style='(.*)'.*<\/dt>\n<dt.*>(.*)<\/dt>\n<\/dl>/iUms";
$html = preg_replace_callback($patterns_float, 'remplaceDl', $html, -1, $count);
Le symptôme : en sortie du preg_replace_callback, la variable $html est resettée, elle devient vide.
Sous Eclipse PDT, elle passe en status "uninitialized".
Lorsque je débugue en pas à pas, la fonction remplaceDl est bien appelée, avec les bons paramètres, et elle renvoit le résultat attendu. Dans mon exemple, elle est appelée 3 fois. Et $count contient bien la valeur 3 en sortie du preg_replace_callback.
Le bug apparait dans toutes les configurations :
- même si le subject $html passé en paramètre ne contient pas de contenu qui matche avec le pattern,
- le bug se produit sous easyphp et Wamp en local, et aussi sur mon serveur distant.
Apparemment, c'est un truc qui cloche dans $patterns_float.
Si j'y supprime <\/dt> à la fin, celui en gras indiqué ci-dessous :
$patterns_float = "/<dl class='spip_document_\d* spip_documents spip_documents_(left|right|center).*<dt><img src='(.*)'.*width='(.*)'.*height='(.*)'.*style='(.*)'.*<\/dt>\n<dt.*>(.*)
<\/dt>\n<\/dl>/iUms";
, cela ne plante pas mais je n'obtiens pas le résultat attendu.
J'ai essayé de diminuer le contenu du subject $html. Et effectivement, si il ne reste que qq dizaines d'octets, cela ne plante plus. Je me demande si cela n'est pas une histoire de pile ?
A noter que j'ai d'autres preg_replace_callback dans la suite du code, qui manipule le même $html, et cela ne plante pas.
Ca vient de quoi d'après vous ?
MERCI pour votre aide.
