Bonjour à tous,
Je cherche à faire un "petit" script en php qui permet d'extraire uniquement le code php d'un fichier pouvant contenir du php et du html (et donc du js eventuellement). Celui ci doit également supprimer les commentaires et les string, qui ne sont pas à proprement parler du code php.
Je dois également remplacer tout ce qui est cité ci-dessus par des caractères (n'importe lequel, disons "-"), simplement pour laisser le code php à la même place dans le fichier d'origine et le fichier parser (afin de pouvoir détécter une erreur dans le code php à tel lignes et tel colonne dans le fichier parsé).
pour le moment je suis parti sur de la regex, mais plus j'avance, plus je me retrouve confronté à d’énorme problème, par exemple:
* prendre en compte toutes les balises de php existantes (<?php, <?, <% et <script language='php'>)
* ne pas prendre en compte les "fausses" femeture de balise dans les strings
* ne pas prendre en compte les balises </script> associée au javascript et non au php
* ne pas prendre en compte les ouvertures/fermetures de balises dans les commentaires de type bloc (/* */)
* prendre en compte les fermetures de balise php dans les commentaires inline // (puisque elles sont interprété )
Et j'en passe des vertes et des pas mûres :'(
Pour avoir un exemple plus concret, voici le fichier sur lequel je travail pour le moment:
et voici ce que j'essaye d'avoir au final:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 <html> <body> /* html */ <!-- <?php echo "string ?> hacked";?> --> <?php /* test de code bien degueu ^^ ?> */ // another test <?php !! echo "marche pas" ?><div><?php echo "hacked-2"; if (preg_match('#^/*' . $this->index . '#', "osef")) { echo "fake comment starting in regex"; } echo "match<br>" ."<script>alert(0);</script>"; ?></div><? echo "same<br>";?> <% echo "another way to open php<br>"; %> <?php echo "<?php strtolower('OSEF');?>";?> <script language="php"> echo "<script> alert('".strtoupper('test1')."'); </script>"; </script> <script> alert('<script language="php">echo strtolower("HACKED");</script>'); </script> </body> </html> <?php echo '<pre> <script> alert("00"); alert(\'<script language="php">echo strtolower("TEST foireux");</script>\'); </script></pre> ';
Alors, bien évidement, je ne vous demande pas de faire le boulot
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 ------ ------ ---------- -----<?php echo "----------------";?>---- <?php ------------------------------ ------ -------------------------------------------?>-----<?php echo "--------"; if (preg_match('----' . $this->index . '-', "----")) { echo "------------------------------"; } echo "---------" ."--------------------------"; ?>------<? echo "--------";?> <% echo "---------------------------"; %> <?php echo "---------------------------";?> <script language="php"> echo "-------- -------".strtoupper('-----')."--- ---------"; </script> -------- -------<script language="php">echo strtolower("------");</script>--- --------- ------- ------- <?php echo '----- -------- ------------ ---------------------------------------------------------------------------- --------------- ';
D'ailleurs j'ai un peu l'impression d'avoir à recréer toute la première partie de l'interpréteur php (CAD le parsing), et je galère comme pas possible sur ce coup.
Par contre, si quelqu'un aurait des pistes, ou connaitrait des scripts existant pour faire quelque chose de similaire sur lesquels je puisse m'appuyer pour faire ce que je veux, ça serrait vraiment super, par-ce sur ce coup, je suis en brasse coulée
Tout conseil sera également le bienvenu
Merci beaucoup.
Partager