Bonsoir à tous
(Pour les feignasses, allez directement en fin de message)
Pour poster ce topic, j'avais le choix entre "Demande d'aide" et "Débats/Discussions". J'ai résolu mon problème, donc c'est pas vraiment une demande d'aide, d'où le fait que je poste ici. mais même si mon problème (concernant les regex PCRE, apache et php comme vous vous en doutez) est résolu, je reconnais ne pas trop bien savoir pourquoi...
Voici une chaîne de caractères:
(On m'a dit de bien commenter mes codes, alors, c'est ce que je fais)
Cette chaine de caractères fait partie d'un fichier, et mon but était de supprimer les commentaires de ce fichier (tout ce qui est entre /* et */, donc, supprimer tous ces "a")
Pour ce faire, dans mon PHP, je charge la chaine de caractères (le fichier entier). Puis je passe cette chaine dans une regex, preg_replace:
(Pour les feignasses, allez directement en fin de message)
Pour poster ce topic, j'avais le choix entre "Demande d'aide" et "Débats/Discussions". J'ai résolu mon problème, donc c'est pas vraiment une demande d'aide, d'où le fait que je poste ici. mais même si mon problème (concernant les regex PCRE, apache et php comme vous vous en doutez) est résolu, je reconnais ne pas trop bien savoir pourquoi...
Voici une chaîne de caractères:
Citation :/*
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
*/
(On m'a dit de bien commenter mes codes, alors, c'est ce que je fais)
Cette chaine de caractères fait partie d'un fichier, et mon but était de supprimer les commentaires de ce fichier (tout ce qui est entre /* et */, donc, supprimer tous ces "a")
Pour ce faire, dans mon PHP, je charge la chaine de caractères (le fichier entier). Puis je passe cette chaine dans une regex, preg_replace:
Code PHP :
<?php
preg_replace('#(/\*([^\*]|\*[^/])*\*/)|(@@.*$)#m', '', $css); // Supprime les commentaires
Et là, tout va bien (ouf!). La regex marche, apache fume son calumet et je suis content. Mais voilà qu'un cow-boy vient rajouter une lettre dans le commentaire:
Citation :/*Rien d'autre dans le fichier ne change... Et apache déterre la hache de guerre!
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab
*/
Citation :L'exception unknown software exception (0xc00000fd) s'est produite dans l'application.En passant, j'adore quand l'ordi me dit que le problème est inconnu, c'est toujours une joie à débugger
Dans les logs Apache, je trouve:
Citation :[Tue Apr 30 20:45:04.640625 2013] [mpm_winnt:notice] [pid 1724:tid 1148] AH00428: Parent: child process exited with status 3221225725 -- Restarting.
Google ne m'a franchement pas aidé sur ce coup-là.
Il m'a bien fallu 2 heures pour court-circuiter des morceaux de code et trouver que l'erreur venait de cette fameuse regex:
Citation :preg_replace('#(/\*([^\*]|\*[^/])*\*/)|(@@.*$)#m', '', $css); // Supprime les commentaires bugg (stack overflow?)
Et là se pose la colle: j'ai deux solutions à ce problème, mais je ne comprend pas pourquoi elles marchent (solutions trouvées au pif et à l'instinct, avec l'aide de la doc php pour la 1ere):
passer en mode 'ungreedy' pour rendre la regex non gourmande
Citation :preg_replace('#(/\*([^\*]|\*[^/])*\*/)|(@@.*$)#mU', '', $css); // Supprime les commentairesCa marche (apache ne crash pas), et je ne sais pas pourquoi
Ou changer de regex (ce que j'ai fait)
Citation :preg_replace('#(/\*([^\*]*(\*[^/])?)*\*/)|(@@.*$)#m', '', $css); // Supprime les commentairesCela marche aussi très bien.
Alors pourquoi la 1ere regex ne marchait-elle pas et pourquoi faisait-elle planter Apache? j'ai essayer de passer les parenthèses en non-capturantes:
Citation :preg_replace('#(/\*(?:[^\*]|\*[^/])*\*/)|(@@.*$)#m', '', $css); // Supprime les commentairesMais cela n'avait pas marché non plus... Alors je m'interroge:
quelle différence y-a-t-il entre ces regex? Pourquoi la 1ere crash apache?
Code :
preg_replace('#(/\*([^\*]|\*[^/])*\*/)|(@@.*$)#m', '', $css);
preg_replace('#(/\*([^\*]|\*[^/])*\*/)|(@@.*$)#mU', '', $css);
preg_replace('#(/\*([^\*]*(\*[^/])?)*\*/)|(@@.*$)#m', '', $css);
A mon avis, c'est un problème de performance (j'ai vu que l'erreur de crash apache était de type "stack overflow"), mais d'où vient cette différence de performances?