Aller au contenu

preg_replace => core dump


Sujets conseillés

Posté

Bonjour,

J'ai une application qui provoque une erreur de segmentation et un core dump, plusieurs fois par jour. Après diverses recherches, le problème est ici:

<?php
echo 'Je teste les cas de core dump.<br />' . "\n";

// Lire la source
if ( $fd = _AT_fopen ('/path_to_file/html1-jl.html', 'rt') ) {
$io_content = '';
for ($i=0; !feof ($fd); $i++) {
$io_content .= rtrim(fgets($fd, 4096));
}
fclose ($fd);
}

// Enlever les commentaires
$io_content = preg_replace ('/\<\!\-\-([^-]|\-[^-]|\-\-[^>])*\-\-\>/', '', $io_content);

// Ecrire la source sans commentaires
if ( $fd3 = _AT_fopen ('/path_to_file/html2-jl.html', 'wt') ) {
fwrite ($fd3, $io_content);
fclose ($fd3);
}

echo 'Fin du test.<br />' . "\n";
?>

Pour la plupart des fichiers sources, aucun problème. Par contre, pour certains fichiers sources qui contiennent plusieurs commentaires multilignes, "Fin du test." n'est jamais affiché à cause d'une erreur de segmentation. Le problème est parfaitement reproductible. Serait-ce un bug php ou voyez-vous une erreur dans mon code ? Avez-vous des suggestions pour contourner le problème ?

Jean-Luc

Posté

Hello,

après un coup d'oeil très rapide, il y a quelques trucs qui me gênent :

1) ta boucle for est une approche assez curieuse je trouve, $i ne te servant pas du tout. Un simple "while" serait plus clair.

2) tu as quasiment tout échapé dans ton expression régulière, c'est très indigeste. Surtout que la quasi totalité des caractères que tu as échapé n'en ont pas besoin. D'ailleurs le flag de "gourmandise" me semble faux pour ton expression.

3) le mode d'ouverture de fichiers "t" je n'ai jamais été un grand fan. je préfère ouvrir en binaire ('b'), et faire les éventuels traitements moi même

Mais sinon en PHP rien ne justifie un "core dump" ou un "segmentation fault".

Posté

Merci pour ta réponse, Kioob.

D'accord avec tes remarques. Pour info:

1. La boucle for était dans le programme d'origine dont j'ai enlevé 90% pour cerner le problème. Le $i servait à quelque chose dans le programme d'origine.

2. J'ai aussi essayé avec

$io_content = preg_replace ('/\<\!--([^-]|-[^-]|--[^>])*-->/', '', $io_content);

et j'obtiens le même résultat.

Je viens de faire des essais en remplaçant le preg_replace par

$io_content = remove_tag ('<!--', '-->', $io_content);

où remove_tag est une fonction que j'ai écrite sans utiliser de regex et le problème a disparu aussitôt.

Jean-Luc

Posté

D'acc, donc le soucis venait bien de preg_replace (ou son utilisation).

Sinon pour l'expression régulière, j'aurais utilisé simplement : '#<!--.*-->#sU', non ?

Posté

Nettement plus élégant ! Merci encore.

Jean-Luc

P.S. et cela élimine aussi la "segmentation fault"

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...